当我们有纯虚函数层次结构时如何实例化一个对象?
How to Institiate an object in when we have pure virtual function hirerachy?
class A{
public: virtual void getName() = 0;
};
class B: public A{
public:
B(int a){
cout<< "B Name : " << a <<endl;
}
void getName() override { cout << "Class B" << endl; }
};
class C: public B{
public:
C(int a){
cout<< "C Name : " << a <<endl;
}
void getName() override { cout << "Class C" << endl; }
};
int main()
{
B *b = new B(10);
b->getName();
C *c = new C(20);
c->getName();
}
我正在尝试创建 Class B
和 C
的对象。但它给了我
的错误
main.cpp:31:15: error: no matching function for call to ‘B::B()’
C(int a){
^
main.cpp:22:9: note: candidate: B::B(int)
B(int a){
^
任何人都可以向我解释为什么会这样吗?为什么它不创建 class 对象?
此问题与virtual
功能无关。
您必须明确指定 B
的哪个构造函数应该用于初始化 member initializer list 中的基础子对象 B
,否则,B
的默认构造函数将被使用但 B
没有。 (请注意,B
有一个采用 int
的用户定义构造函数,然后不会为 B
生成默认构造函数。)
For members that cannot be default-initialized, such as members of reference and const-qualified types, member initializers must be specified.
例如
C(int a) : B(a) {
// ^^^^^^
cout<< "C Name : " << a <<endl;
}
问题与任何父级的抽象性无关 class,这是因为您的 C
构造函数试图初始化父级 B
class通过B
默认构造函数,它没有。
你需要"call"参数化B
构造函数通过构造函数初始化列表
C(int a)
: B(a) // "Calls" the B constructor
{
}
可选择将默认构造函数添加到 B
class。
B(int a){
cout<< "B Name : " << a <<endl;
}
构造C
的时候,还要构造B
。如果不指定如何初始化 sub class(通过初始化列表指定要调用的构造函数),则 base 是默认构造的,需要默认构造函数。
由于您为 B
class 定义了构造函数,因此没有为 B
生成默认构造函数。您可以为 B
定义默认构造函数或指定 B(int a)
以通过初始化列表使用。
请注意,您可以创建 B
的对象而无需为基础 A
指定构造函数,因为 A
class 生成了一个使用的默认构造函数。
class A{
public: virtual void getName() = 0;
};
class B: public A{
public:
B(int a){
cout<< "B Name : " << a <<endl;
}
void getName() override { cout << "Class B" << endl; }
};
class C: public B{
public:
C(int a){
cout<< "C Name : " << a <<endl;
}
void getName() override { cout << "Class C" << endl; }
};
int main()
{
B *b = new B(10);
b->getName();
C *c = new C(20);
c->getName();
}
我正在尝试创建 Class B
和 C
的对象。但它给了我
main.cpp:31:15: error: no matching function for call to ‘B::B()’
C(int a){
^
main.cpp:22:9: note: candidate: B::B(int)
B(int a){
^
任何人都可以向我解释为什么会这样吗?为什么它不创建 class 对象?
此问题与virtual
功能无关。
您必须明确指定 B
的哪个构造函数应该用于初始化 member initializer list 中的基础子对象 B
,否则,B
的默认构造函数将被使用但 B
没有。 (请注意,B
有一个采用 int
的用户定义构造函数,然后不会为 B
生成默认构造函数。)
For members that cannot be default-initialized, such as members of reference and const-qualified types, member initializers must be specified.
例如
C(int a) : B(a) {
// ^^^^^^
cout<< "C Name : " << a <<endl;
}
问题与任何父级的抽象性无关 class,这是因为您的 C
构造函数试图初始化父级 B
class通过B
默认构造函数,它没有。
你需要"call"参数化B
构造函数通过构造函数初始化列表
C(int a)
: B(a) // "Calls" the B constructor
{
}
可选择将默认构造函数添加到 B
class。
B(int a){
cout<< "B Name : " << a <<endl;
}
构造C
的时候,还要构造B
。如果不指定如何初始化 sub class(通过初始化列表指定要调用的构造函数),则 base 是默认构造的,需要默认构造函数。
由于您为 B
class 定义了构造函数,因此没有为 B
生成默认构造函数。您可以为 B
定义默认构造函数或指定 B(int a)
以通过初始化列表使用。
请注意,您可以创建 B
的对象而无需为基础 A
指定构造函数,因为 A
class 生成了一个使用的默认构造函数。