gpt4 book ai didi

c++ - 当我从下面的代码中删除关键字virtual时,它可以正常工作,否则会出错。单词 “virtual”在这里的意义是什么?

转载 作者:行者123 更新时间:2023-12-02 10:00:44 25 4
gpt4 key购买 nike

下面的代码给出了一个编译时错误,但是当我从下面删除关键字“virtual” 时,它可以正常工作。我知道进行虚拟继承是为了避免基类成员的多个副本,但是在这里关键字“虚拟” 的意义是什么?

#include<iostream> 
using namespace std;

class A {
int a;
A() {
cout<<"I am A\n";
a = 1;
}
public :
friend class B;
};
class B : virtual public A {
int b;
public :
B() {
cout<<"I am B\n";
b = 2;
}
};
class C : public B {
int c;
public :
C() {
cout<<"I am C\n";
c = 3;
}
};
int main()
{
C var;
return 0;
}

最佳答案

virtual基类的初始化遵循与常规基类不同的逻辑。
https://en.cppreference.com/w/cpp/language/derived_class#Virtual_base_classes:

All virtual base subobjects are initialized before any non-virtual base subobject, so only the most derived class calls the constructors of the virtual bases in its member initializer list:


在您的情况下, C的构造函数可以认为是:
C() : A(), B() {
cout<<"I am C\n";
c = 3;
}
这是一个问题,因为 A()被声明为 private
AB的常规基类时,可以将 C()视为:
C() : B() {  // No A()
cout<<"I am C\n";
c = 3;
}
鉴于您发布的代码,这不是问题。

关于c++ - 当我从下面的代码中删除关键字virtual时,它可以正常工作,否则会出错。单词 “virtual”在这里的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62684200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com