C ++类继承体系结构 - 防止强制转换

时间:2010-04-08 14:05:57

标签: c++ class inheritance casting

我有一个基类结构和几个继承的类。 基类应该是纯虚拟类,它应该防止实例化。 可以实例化继承的类。 代码示例如下:

class BaseClass
{
public:
    BaseClass(void);
    virtual ~BaseClass(void) = 0;
};

class InheritedClass : public BaseClass
{
public:
    InheritedClass1(void);
    ~InheritedClass1(void);
};

class DifferentInheritedClass : public BaseClass
{
public:
    DifferentInheritedClass(void);
    ~DifferentInheritedClass(void);
};

我想阻止以下操作发生:

InheritedClass *inherited1 = new InheritedClass();

DifferentInheritedClass *inherited2 = new DifferentInheritedClass ();

BaseClass *base_1 = inherited1;
BaseClass *base_2 = inherited2;

*base_1 = *base_2;

5 个答案:

答案 0 :(得分:10)

使BaseClass中的复制构造函数和赋值运算符受到保护。该类已经不可创建,因此您不需要公共复制构造函数和赋值运算符。使用受保护的复制构造函数和赋值运算符,您可以从派生类构造函数和赋值运算符中调用它。

答案 1 :(得分:2)

您无法阻止其他程序员使用演员表。他们可以自由地解释你的内存布局,但他们希望使用reinterpret_cast或C风格的演员,但这样做会调用未定义的行为。

编辑: 正如sharptooth所说,你可以使基类'复制构造函数受到保护,以防止出现这些问题。

答案 2 :(得分:1)

您可以通过保护BaseClass的赋值运算符来阻止*base_1 = *base_2,但不能阻止base_1 = base_2

答案 3 :(得分:0)

如果你可以使用Boost C ++ Libs,那么你可以使用boost :: non_copyable基类。或者如上所述,您可以将所需操作声明为受保护的,例如复制构造函数或赋值运算符。

答案 4 :(得分:-1)

自从我使用C ++进行编程以来已经有一段时间了,但您是否有可能为BaseClass重载运算符以防止分配发生?

可能有以下几点:

BaseClass& BaseClass::operator=(const BaseClass& myVar)
{ 
   if(this != &myVar)
      return *this
}