如果一个父类是接口,是否可以使用多重继承?

时间:2012-05-13 05:16:20

标签: c++ inheritance multiple-inheritance virtual-functions

enter image description here

如果一个父类是一个接口(只包含带虚拟析构函数的纯虚函数),是否可以使用多重继承?

我想只公开接口部分(图中的黄色类)以提高编译速度。绿色部分是实施部分。但CPet应该继承自CAnimal(is-a relation)和IPet(实现),还有“死亡钻石”:(

接口类(黄色)只有纯虚函数和虚拟破坏,所以当我通过工厂类创建CDog,CCat时,没有像模糊这样的问题。 CDog有两个vtable(来自IDog和CPet),但在虚函数表中,这些点表示相同的功能(CDog成员函数)。

没有编译错误,没有运行错误......但我担心这种层次结构。 没问题还是有问题?

PS:我不想使用'虚拟继承',因为如果我使用它,我不能通过监视视图查看类成员变量。(我想这是因为虚拟继承链接到父类,如链接 - 列表)。

环境:Visual Studio C ++ 2008或更高版本。

1 个答案:

答案 0 :(得分:2)

鉴于上述描述,您不应该实例化CPet的实例,因为IAnimal::isAlive() vtable中未定义纯虚函数IPet

struct IAnimal {
    virtual ~IAnimal() {}
    virtual void isAlive() = 0;
};

struct IPet : public IAnimal {
};

struct CAnimal : public IAnimal {
    virtual void isAlive() {
    }
};

struct CPet : public CAnimal, public IPet {
};

int main(void) {
    CPet cp;
}

使用Visual C ++ 2008编译时生成以下内容2010:

animal.cpp(18) : error C2259: 'CPet' : cannot instantiate abstract class
    due to following members:
    'void IAnimal::isAlive(void)' : is abstract
    mytest.cpp(5) : see declaration of 'IAnimal::isAlive'

海湾合作委员会发出类似的警告:

animal.cpp: In function 'int main()':
animal.cpp:18:7: error: cannot declare variable 'cp' to be of abstract type 'CPet'
animal.cpp:14:8: note:   because the following virtual functions are pure within 'CPet':
animal.cpp:3:15: note:  virtual void IAnimal::isAlive()