我有一个基类结构和几个继承的类。 基类应该是纯虚拟类,它应该防止实例化。 可以实例化继承的类。 代码示例如下:
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;
答案 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
}