关于Virtual继承的事

路人戊戌乙亥 2014-05-21 10:59:00
最近写的代码涉及到一部分Virtual继承的问题,我把原型提取出来如下:
#include <iostream>
using namespace std;
class A{
public:
explicit A(int a){
cout << "A(a)"<<endl;
}
explicit A() {
cout << "A()"<<endl;
}
virtual ~A(){
}
};

class B: virtual public A {
public:
explicit B(int a): A(a){
cout <<"B(b)"<<endl;
}
explicit B() {
cout << "B()"<<endl;
}
virtual ~B(){
}
};

class C: virtual public B {
public:
explicit C(int c):B(c) {
cout << "C(c)"<<endl;
}
virtual ~C(){
}
};

int main () {

C c(2);
return 1;
}

本来希望的结果是:
A(a)
B(b)
C(c)
但是得到的实际结果是:
A()
B(b)
C(c)

内存地址显示,只有一个虚拟表;
在google上看到一个老外说: 虚拟继承看作是本身的一个指针,真心没理解。

...全文
246 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
码工许师傅 2014-05-25
  • 打赏
  • 举报
回复
引用 4 楼 u012878842 的回复:
[quote=引用 2 楼 ri_aje 的回复:] 虚拟继承得不到你希望的结果,因为最终派生类 (C) 必须负责构造虚基类 (A) 子对象,而且只调用虚基类默认构造函数完成构造任务。
你说的是对的,确实药油C负责构造,所以我也是按3楼的方式改的; 现在的问题是: 1. 这个虚拟继承之后的内存结构是怎样的? 2. 为什么要由C的构造? 3. 有没有比较明确的文献或者资料可以参看? 谢谢楼上几位的回答[/quote] 《深度探索C++对象模型》
lm_whales 2014-05-24
  • 打赏
  • 举报
回复
大概为了避免,不同路径继承的虚基类, 初始化被虚拟继承的那个类的子对象,有不同初始化方式而造成的歧义; 因为该虚基类子对象,只构造一次,,所以只用缺省构造函数初始化。 所以构造函数跟虚基类,相关的初始化表被忽略。。 虚基类子对象在子类中只是一个指针来表示; 所以可以被每个继承路径公用。 真正虚基类子对象,编译器可以任意安排他的位置。
难题 2014-05-21
  • 打赏
  • 举报
回复
同问啊,来学习,看大牛怎么回答
边走边瞧 2014-05-21
  • 打赏
  • 举报
回复
引用 5 楼 u012878842 的回复:
[quote=引用 3 楼 Saleayas 的回复:] explicit C(int c):A(c), B(c) {
谢谢回复,你说的方法是对的,能帮忙回答下我在四楼的问题吗?[/quote] 不同的编译器不一样,vc的资料你搜“虚拟继承”可以找到资料。
路人戊戌乙亥 2014-05-21
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
explicit C(int c):A(c), B(c) {
谢谢回复,你说的方法是对的,能帮忙回答下我在四楼的问题吗?
路人戊戌乙亥 2014-05-21
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
虚拟继承得不到你希望的结果,因为最终派生类 (C) 必须负责构造虚基类 (A) 子对象,而且只调用虚基类默认构造函数完成构造任务。
你说的是对的,确实药油C负责构造,所以我也是按3楼的方式改的; 现在的问题是: 1. 这个虚拟继承之后的内存结构是怎样的? 2. 为什么要由C的构造? 3. 有没有比较明确的文献或者资料可以参看? 谢谢楼上几位的回答
Saleayas 2014-05-21
  • 打赏
  • 举报
回复
explicit C(int c):A(c), B(c) {
ri_aje 2014-05-21
  • 打赏
  • 举报
回复
虚拟继承得不到你希望的结果,因为最终派生类 (C) 必须负责构造虚基类 (A) 子对象,而且只调用虚基类默认构造函数完成构造任务。

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧