标签: virtual-inheritance

在C++中,我应该几乎总是使用虚拟继承吗?

我从这个条目中看到虚拟继承将sizeof(指针)添加到对象的内存占用.除此之外,默认情况下使用虚拟继承是否有任何缺点,只有在需要时才使用常规继承?这似乎会带来更具前瞻性的课堂设计,但也许我错过了一些陷阱.

c++ multiple-inheritance virtual-inheritance

25
推荐指数
2
解决办法
5485
查看次数

在钻石层次结构中向下倾斜

为什么static_cast不能从虚拟基地垂头丧气?

struct A {};
struct B : public virtual A {};
struct C : public virtual A {};
struct D : public B, public C {};

int main()
{
  D d;
  A& a = d;
  D* p = static_cast<D*>(&a); //error
}  
Run Code Online (Sandbox Code Playgroud)

g ++ 4.5说:

 error: cannot convert from base ‘A’ to derived type ‘D’ via virtual base ‘A’
Run Code Online (Sandbox Code Playgroud)

解决方案是使用dynamic_cast?但为什么.什么是理性?

- 编辑 -
下面非常好的答案.没有答案详细说明子对象和vtable最终如何订购.以下文章为gcc提供了一些很好的例子:http:
//www.phpcompiler.org/articles/virtualinheritance.html#Downcasting

c++ casting virtual-inheritance static-cast diamond-problem

23
推荐指数
2
解决办法
1961
查看次数

如何在编译器中实现C++虚拟继承?

编译器如何实现虚拟继承?

在以下代码中:

class A {
  public:
    A(int) {}
};

class B : public virtual A {
  public:
    B() : A(1) {}
};

class C : public B {
  public:
    C() : A(3), B() {}
};
Run Code Online (Sandbox Code Playgroud)

编译器是否生成两个B::ctor函数实例,一个没有A(1)调用,一个带有它?因此,当B::constructor从派生类的构造函数调用时,将使用第一个实例,否则使用第二个实例.

c++ compiler-construction inheritance virtual-inheritance

23
推荐指数
2
解决办法
5483
查看次数

c ++虚拟继承

问题:

class Base {
public:
  Base(Base* pParent);
  /* implements basic stuff */
};

class A : virtual public Base {
public:
  A(A* pParent) : Base(pParent) {}
  /* ... */
};

class B : virtual public Base {
public:
  B(B* pParent) : Base(pParent) {}
  /* ... */
};

class C : public A, public B {
public:
  C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here
  /* ... */
};
Run Code Online (Sandbox Code Playgroud)

在给定的位置,gcc抱怨它无法匹配函数调用Base(),即默认构造函数.但是C不直接从Base继承,只通过A和B.那么为什么gcc会在这里抱怨?

想法?TIA/Rob

c++ virtual gcc virtual-inheritance

22
推荐指数
3
解决办法
4072
查看次数

在调用非虚拟基本方法时,C++中是否有任何惩罚/成本的虚拟继承?

当我们从其基类调用常规函数成员时,在C++中使用虚拟继承是否会在编译代码中产生运行时损失?示例代码:

class A {
    public:
        void foo(void) {}
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {};

// ...

D bar;
bar.foo ();
Run Code Online (Sandbox Code Playgroud)

c++ runtime overhead virtual-inheritance

22
推荐指数
3
解决办法
3874
查看次数

虚拟继承中构造函数调用的顺序

class A {
        int i;
public: 
        A() {cout<<"in A's def const\n";};
        A(int k) {cout<<"In A const\n";  i = k; }
        };

class B : virtual public A {
public:
        B(){cout<<"in B's def const\n";};
        B(int i) : A(i) {cout<<"in B const\n";}
        };

class C :   public B {
public:
        C() {cout<<"in C def cstr\n";}
        C(int i) : B(i) {cout<<"in C const\n";}
        };

int main()
{
        C c(2);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种情况下的输出是

in A's def const
in B const
in C const …
Run Code Online (Sandbox Code Playgroud)

c++ constructor virtual-inheritance

22
推荐指数
2
解决办法
7327
查看次数

C++私有虚拟继承问题

在下面的代码中,似乎类C无法访问A的构造函数,这是因为虚拟继承所必需的.然而,代码仍然编译和运行.它为什么有效?

class A {};
class B: private virtual A {};
class C: public B {};

int main() {
    C c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我从A中删除默认构造函数,例如

class A {
public:
    A(int) {}
};
class B: private virtual A {
public:
    B() : A(3) {}
};
Run Code Online (Sandbox Code Playgroud)

然后

class C: public B {};
Run Code Online (Sandbox Code Playgroud)

会(意外地)编译,但是

class C: public B {
public:
    C() {}
};
Run Code Online (Sandbox Code Playgroud)

不会像预期的那样编译.

使用"g ++(GCC)3.4.4(cygming special,gdc 0.12,使用dmd 0.125)编译的代码",但已经验证它与其他编译器的行为相同.

c++ inheritance encapsulation virtual-inheritance private-inheritance

20
推荐指数
2
解决办法
3614
查看次数

为什么必须由派生类最多的类构造虚拟基类?

以下代码将无法编译:

class A {
public:
    A(int) {}
};

class B: virtual public A {
public:
    B(): A(0) {}
};

// most derived class
class C: public B {
public:
    C() {} // wrong!!!
};
Run Code Online (Sandbox Code Playgroud)

如果我AC构造函数初始化列表中调用构造函数,那就是:

// most derived class
class C: public B {
public:
    C(): A(0) {} // OK!!!
};
Run Code Online (Sandbox Code Playgroud)

它确实有效.

显然,原因是因为虚拟基类必须始终由最派生的类构造.

我不明白这个限制背后的原因.

c++ inheritance virtual-inheritance

19
推荐指数
3
解决办法
2329
查看次数

在多重继承中理解vptr?

我试图理解书中有效的c ++语句.以下是多继承的继承图.

在此输入图像描述

在此输入图像描述

现在这本书说vptr需要每个类中的单独内存.它也做了以下声明

上图中的一个奇怪之处在于,即使涉及四个类,也只有三个vptrs.如果愿意,实现可以自由地生成四个vpt,但是三个就足够了(事实证明B和D可以共享一个vptr),并且大多数实现利用这个机会来减少编译器生成的开销.

我看不出有什么理由为什么每个类都要求为vptr提供单独的内存.我理解vptr是从基类继承的,可能是继承类型.如果我们假设它显示了带有继承的vptr的结果内存结构,那么它们如何才能生成该语句

B和D可以共享vptr

有人可以在多重继承中澄清一下vptr吗?

  • 我们每个班级都需要单独的vptr吗?
  • 如果以上是真的,为什么B和D可以共享vptr?

c++ multiple-inheritance virtual-inheritance vtable vptr

17
推荐指数
2
解决办法
5631
查看次数

相当于C++中的Java接口?

可能重复:
如何在C++中声明接口?
接口如c ++中的java?

我是一名学习C++的Java程序员,我想知道C++中是否存在类似Java接口的东西,即另一个类可以实现/扩展多个类的类.谢谢.ps新来的,告诉我,如果我做错了什么.

c++ java abstract-class overriding virtual-inheritance

16
推荐指数
1
解决办法
2万
查看次数