创建未知类的对象(两个继承的类)

Posted

技术标签:

【中文标题】创建未知类的对象(两个继承的类)【英文标题】:Create object of unknown class (two inherited classes) 【发布时间】:2010-04-27 16:45:30 【问题描述】:

我有以下课程:

class A 
    void commonFunction() = 0;


class Aa: public A 
    //Some stuff...


class Ab: public A 
    //Some stuff...

根据用户输入,我想创建一个 Aa 或 Ab 的对象。我的初衷是这样的:

A object;
if (/*Test*/) 
    Aa object;
 else 
    Ab object;

但是编译器给了我:

error: cannot declare variable ‘object’ to be of abstract type ‘A’
because the following virtual functions are pure within ‘A’:
//The functions...

有什么好办法解决这个问题吗?

【问题讨论】:

你的基类也需要一个虚拟析构函数。 【参考方案1】:

使用指针:

A *object;
if (/*Test*/) 
    object = new Aa();
 else 
    object = new Ab();

【讨论】:

【参考方案2】:
A * object = NULL;
if (/*Test*/) 
    object = new Aa;
 else 
    object = new Ab;

【讨论】:

【参考方案3】:

正如其他人所指出的,C++ 中的运行时多态性通过指针或引用工作。 一般来说,您正在寻找Factory Design Pattern。

【讨论】:

【参考方案4】:

'A' 是一个抽象类。它没有自己的 commonFunction() 实现,因此不能直接实例化。只有它的后代可以被实例化(假设它们实现了所有的抽象方法)。

如果您想根据输入实例化后代类,然后在通用代码中使用该对象,请改为执行以下操作:

A* object;
if (/*Test*/) 
    object = new Aa;
 else 
    object = new Ab;

...
object->commonFunction();
...
delete object;

【讨论】:

以上是关于创建未知类的对象(两个继承的类)的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的三大特性

将图像分配给从 Qimage 继承的类的对象

面向对象的三大特性之继承

面向对象之进阶继承

面向对象--继承和重写

JavaScript的类