首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果一个父类是一个接口,是否可以使用多重继承?

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

Stack Overflow用户
提问于 2012-05-13 13:16:20
回答 1查看 959关注 0票数 2

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

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

接口类(黄色)只有纯虚函数和虚销毁,所以当我通过工厂类创建CDog、CCat时,不会出现模棱两可的问题。CDog有两个vtable(来自IDog和CPet),但在虚函数表中,这两个点表示相同的函数(CDog成员函数)。

没有编译错误,也没有运行错误...但我担心的是这种等级制度。这是正常的,还是有什么问题?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-13 14:01:13

根据上面的描述,您应该不能实例化CPet的实例,因为纯虚拟函数IAnimal::isAlive()IPet vtable中是未定义的。

代码语言:javascript
复制
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编译时会生成以下内容:

代码语言:javascript
复制
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给出了类似的警告:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10569499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档