Wiz*_*ann 9 c++ oop inheritance constructor pure-virtual
以下示例来自"Inside C++对象模型"一书
class Abstract_base {
public:
virtual ~Abstract_base () = 0;
virtual void interface () const = 0;
virtual const char* mumble () const
{
return _mumble;
}
protected:
char *_mumble;
};
Run Code Online (Sandbox Code Playgroud)
作者说如果我想初始化_mumble
,那么应该实现纯虚基类的数据成员,一个"受保护的构造函数".
但为什么要保护?为什么"公共建设者"不适合这个班级?
谢谢你的回答,如果有一个例子,这将是完美的~~ :)
这并不重要,因为无论如何都不允许构造基类的对象.使它protected
只是作为一个事实的提醒,该类应该是一个基类; 它只是化妆品/文件.
考虑
struct Base {
virtual ~Base() = 0;
protected:
Base() { std::puts("Base constructor"); }
};
Base::~Base() { std::puts("Base destructor"); }
struct Derived : Base {};
int main()
{
//Base b; // compiler error
Derived d;
Base *b = new Derived();
delete b;
}
Run Code Online (Sandbox Code Playgroud)
删除protected
不会以任何方式改变程序的含义.
构造函数是公共的还是受保护的并不重要,因为抽象类无法实例化.
您必须从中继承以便调用它的构造函数,并且由于Derived类调用抽象类的构造函数,因此只要Derived类可以访问它,您选择的保护级别无关紧要.
人们可能拥有它的一个原因protected
是提醒人们必须通过继承来构造类,但老实说,当它看到它具有纯虚拟成员函数时应该足够清楚.
struct B {
virtual void func () = 0;
virtual ~B () = 0 { };
};
B::~B () { }
Run Code Online (Sandbox Code Playgroud)
struct D : B {
void func () override;
};
Run Code Online (Sandbox Code Playgroud)
int main () {
B b; // will error, no matter if Bs ctor is 'public' or 'protected'
// due to pure virtual member-function
D d; // legal, D has overriden `void B::func ()`
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23302 次 |
最近记录: |