对C ++中的虚拟基类感到困惑

Zhiwei Chen

众所周知,无论派生级别有多深,“虚拟基类子对象在对象构建过程中仅由“最派生”类初始化一次,而不由“中间派生多次初始化类,这种“虚拟基础”的语义是由编译器保证并实现的,但是,当我研究除“构造函数”之外的其他成员函数时,我发现编译器不会将它们视为构造函数,即,它对防止多次调用虚拟基类的成员函数,下面是代码:

class vb
{
public:
    void f(){cout << "vb::f"<<endl;}

};
class A: public virtual vb
{
public:
    int a;
public:
    void f()
    {
        vb::f();
        cout<<"A::f"<<endl;
    }
};
class B: public virtual vb
{
public:
    int b;
public:
    void f()
    {
        vb::f(); 
        cout<<"B::f"<<endl;
    }
};
class C: public A,public B
{
public:
    int c;
public: 
    void f()
    {
        vb::f();
        A::f();
        B::f();
        cout<<"C::f"<<endl;
    }

};

// test example
int main()
{
    C a;
    a.f();
}

我在Visual Studio 2008中测试此代码段,结果是:

vb :: f

vb :: f

A :: f

vb :: f

B :: f

C :: f但是,所需的结果是:

vb :: f

A :: f

B :: f

C :: f

我的问题是:

  1. 在上述情况下,如何使vb :: f()仅被调用一次?

  2. 为什么C ++的实现者不直接从语言级别支持这种语义?

好的,我会尽力使自己理解,但是,我不是英语的母语人士,希望您理解我的意思,并感谢您的答复!

ro

当一个以上的派生类从同一个类继承虚拟时,该类的一个子对象将在最多派生类的对象之内。这意味着它只能被初始化一次-并且它是由最派生的类完成的。

但这仅仅是初始化。但是,这并不意味着只有最派生的类才能访问虚拟库的成员。

您的示例中的继承树如下所示:

   vb
  /  \
 A    B
 \   /
   C

而如果没有虚拟继承,它将是这样的:

vb  vb
 |   |
 A   B
 \   /
   C

没什么特别的AB在两种情况下,它们都从a派生而出vb,可以毫无问题地调用其方法。在第二种情况下,内部C调用vb::f()是不明确的,并且是错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对C ++中的虚拟基类感到困惑

来自分类Dev

c# 对基类继承感到困惑

来自分类Dev

对C ++类用法感到困惑

来自分类Dev

对C中的for循环感到困惑

来自分类Dev

对C中的此语句感到困惑?

来自分类Dev

对C编程中的“僵尸进程”感到困惑

来自分类Dev

对使用C中的指针的宏感到困惑

来自分类Dev

对C编程中的“僵尸进程”感到困惑

来自分类Dev

对 c# 中的向下转型感到困惑

来自分类Dev

限制C ++中虚拟基类的对象共享

来自分类Dev

限制C ++中虚拟基类的对象共享

来自分类Dev

对C中的指针和泛型(void)指针感到困惑

来自分类Dev

对数字的值和C中的数字范围感到困惑

来自分类Dev

我对在C ++中对'<<'使用运算符重载感到困惑

来自分类Dev

在C中定义类型时对指针语法感到困惑

来自分类Dev

在C ++中创建节点的不同方式感到困惑吗?

来自分类Dev

在C ++结构声明中对代码的目的/含义感到困惑

来自分类Dev

我对C#中的可选匿名函数感到困惑

来自分类Dev

在C#中为游戏选择XNA时感到困惑

来自分类Dev

对在C#中传递ref / value感到困惑

来自分类Dev

对 C 中的“通过引用传递”以及何时使用 & 或 * 感到困惑

来自分类Dev

真的对c ++继承感到困惑

来自分类Dev

对C ++多重继承感到困惑

来自分类Dev

C ++-对声明枚举感到困惑

来自分类Dev

对教授关于类和类参数的说明感到非常困惑 - C++ 课程介绍

来自分类Dev

为C ++中的基类和派生类声明“虚拟”构造函数?

来自分类Dev

在C ++中,公共继承基类调用派生类的私有虚拟功能

来自分类Dev

C ++中虚拟类的向量

来自分类Dev

为什么在C ++中调用此虚拟函数会导致基类出现“缺少符号”错误?

Related 相关文章

热门标签

归档