受保护的构造函数,使基类不可实例化

ste*_*fen 6 c++ inheritance constructor virtual-functions

如果我想避免它的实例,那么使基类构造函数受到保护是一种好习惯吗?我知道我也可以使用纯虚拟虚拟方法,但这看起来很奇怪......

请考虑以下代码:

#include <iostream>

using std::cout;
using std::endl;

class A 
{
protected:
    A(){};
public:
    virtual void foo(){cout << "A\n";};
};

class B : public A
{
public:
    void foo(){cout << "B\n";}
};

int main()
{
    B b;
    b.foo();
    A *pa = new B;
    pa->foo();

    // this does (and should) not compile:
    //A a;
    //a.foo();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有没有缺点或副作用,我看不到?

vil*_*lla 5

使基类构造函数受到保护是一种常见的做法。当您在基类中具有纯虚函数时,则不需要这样做,因为您将无法实例化它。

但是,在基类中定义非纯虚函数并不被认为是一种好习惯,但是在很大程度上取决于您的用例并且不会造成损害。

没有任何不利或副作用。使用受保护的构造函数,您只需告诉其他开发人员,您的类仅打算用作基础。