
c++类中继承时,virtual 关键字怎么用,例如:
#include<iostream.h>classA{public:A(inta1){a=a1;}inta;};classB:virtualpublicA{public:...
#include<iostream.h>
class A
{public:
A(int a1)
{a=a1;}
int a;
};
class B:virtual public A
{ public:
B(int a1,int b1):A(a1)
{b=b1;}
int b;
};
class D:virtual public B
{
public:
D(int a1,int b1,int d1):B(a1,b1)
{d=d1;//编译时指向这错,为什么?}
int d;
};
void main()
{D dd(1,2,3);
cout<<dd.a<<endl;
cout<<dd.b<<endl;
cout<<dd.d<<endl;}
error C2512: 'A::A' : no appropriate default constructor available
错误是什么意思 展开
class A
{public:
A(int a1)
{a=a1;}
int a;
};
class B:virtual public A
{ public:
B(int a1,int b1):A(a1)
{b=b1;}
int b;
};
class D:virtual public B
{
public:
D(int a1,int b1,int d1):B(a1,b1)
{d=d1;//编译时指向这错,为什么?}
int d;
};
void main()
{D dd(1,2,3);
cout<<dd.a<<endl;
cout<<dd.b<<endl;
cout<<dd.d<<endl;}
error C2512: 'A::A' : no appropriate default constructor available
错误是什么意思 展开
展开全部
已改,看注释
#include<iostream>
using namespace std;
class A
{
public:
A(int a1)
{a=a1;}
int a;
};
class B:virtual public A
{
public:
B(int a1,int b1):A(a1)
{b=b1;}
int b;
};
class D:virtual public B
{
public:
D(int a1,int b1,int d1):B(a1,b1) ,A(a1) //这里也要把A类的构造函数写上
{d=d1; }//编译时指向这错,为什么?
int d;
};
void main()
{
D dd(1,2,3);
cout<<dd.a<<endl;
cout<<dd.b<<endl;
cout<<dd.d<<endl;
}
#include<iostream>
using namespace std;
class A
{
public:
A(int a1)
{a=a1;}
int a;
};
class B:virtual public A
{
public:
B(int a1,int b1):A(a1)
{b=b1;}
int b;
};
class D:virtual public B
{
public:
D(int a1,int b1,int d1):B(a1,b1) ,A(a1) //这里也要把A类的构造函数写上
{d=d1; }//编译时指向这错,为什么?
int d;
};
void main()
{
D dd(1,2,3);
cout<<dd.a<<endl;
cout<<dd.b<<endl;
cout<<dd.d<<endl;
}
更多追问追答
追问
那为什么不加 virtual 时在写D的构造函数时不用加A的构造函数?
追答
因为是虚拟继承,基类的构造函数只被调用一次,就是调用D的构造函数前调用的A类无参的构造函数,而不是A类有参的构造函数
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你是虚继承,那么他是不会调用基类构造函数的,顺便说一点,虚继承,几乎不用,一般情况构造函数最好不要弄成虚的,你虚继承的话,积累构造函数也是虚的了!这样生成对象时就不会调用基类构造函数了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
去看看虚基类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询