2

在此处输入图像描述

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

我想只暴露接口部分(图中的黄色类)以提高编译速度。绿色部分是执行部分。但是CPet应该从CAnimal(is-a relationship)和IPet(implement)继承,有“死亡钻石”:(

接口类(黄色部分)只有纯虚函数和虚销毁,所以当我通过工厂类创建CDog、CCat时,没有歧义之类的问题。CDog 有两个 vtable(来自 IDog 和 CPet),但在虚函数表中,点表示相同的函数(CDog 成员函数)。

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

PS:我不想使用“虚拟继承”,因为如果我使用它,我无法通过观察视图查看类成员变量。(我猜这是因为虚拟继承链接到父类,如链表。)

环境:Visual Studio C++ 2008 或以上。

4

1 回答 1

2

鉴于上面的描述,您应该无法实例化 的实例,CPet因为纯虚函数IAnimal::isAlive()IPetvtable 中未定义。

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'

GCC 会产生类似的警告:

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()
于 2012-05-13T06:01:13.310 回答