抽象类的派生类构造函数
Derived Class Constructor from an Abstract Class
我有一个从抽象类派生类的问题例子:
#include <iostream>
using namespace std;
class A
{
protected:
int a,b;
public:
A(): a(0), b(0) {}
A(int na,int nb): a(na), b(nb) {}
virtual void print() = 0; // Reason to be an abstract class
};
class B : public A
{
public:
B(int a, int b) {A(a,b);}
void print()
{
cout << a << endl;
cout << b << endl;
}
};
int main(){
B clase(3,2);
clase.print();
return 0;
}
上面的代码给了我一个这样的错误:
lab1.cpp: In constructor ‘B::B(int, int)’:
lab1.cpp:20:10: error: invalid cast to abstract class type ‘A’
A(a,b);
^
lab1.cpp:5:7: note: because the following virtual functions are pure within ‘A’:
class A
^
lab1.cpp:12:16: note: virtual void A::print()
virtual void print() = 0;
^
注意:我知道如何使它工作,B构造函数看起来像这样:
B(int a, int b): A(a,b) {}
但是我真正的问题是,如果我想在分支中调用派生类的构造函数(像上面的代码一样)该怎么办?在分支中调用抽象构造函数的正确方法是什么?
在分支中调用抽象构造函数的正确方法是什么?
没有。
有一个很好的理由。必须先构造父类,然后才能构造类。
当你为构造函数编写代码时,你就有了一个合理构造的对象。您的父类至少被构造。
这是用构造函数的初始化语法简洁地表达出来的。
B::B(int a, int b):A(a, b) {
// A is complete. now we can do stuff.
必须在成员初始化列表中初始化b的A部分,而不是在b的构造函数体中:
class A
{
virtual void print() = 0 {cout << "I am Pure function";}
};
class B : public A
{
public:
B(int a, int b) : A(a,b) {}
// B(int a, int b) {A(a,b);} /. incorrect
void print()
{
cout << a << endl;
cout << b << endl;
}
};
- 你也可以定义纯虚函数,以允许从派生类的对象链接功能。
相关文章:
- 如何委托派生类使用其父构造函数?
- 如果基类包含双指针成员,则派生类的构造函数
- C++:为什么无法在派生类中访问受保护的构造函数?
- C++派生的类构造函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 在没有默认构造函数的情况下创建的派生对象
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- 如何在派生构造函数中多次构造基类
- C++(控制台)构造函数和派生类
- 为什么为派生类定义复制构造函数需要定义基类的默认构造函数?
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 将派生类的构造函数声明为父类的友元
- 如何为具有私有成员的派生类实现移动构造函数
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在派生自线程类的构造函数中传递字符串
- C++ 为什么要将对基类的引用传递给派生类的构造函数
- C++将派生类的const值传递给基意外行为的构造函数
- 在模板派生类中继承具有类型别名的构造函数
- 正在调用基方法,而不是从构造函数派生方法