如果虚函数引用C ++中派生类中的变量,这是安全的吗?

时间:2010-06-26 13:46:41

标签: c++ visual-c++

派生时被抛回基地。 安全,我的意思是它适用于已知的c ++编译器。 它似乎适用于VIsual C ++ 2008。 E.g

class zero
{
 virtual int v()=0;
}

class a: public zero
{
public:
   int value;
   a(int vin)
   {
      value =vin;
   }
   int v()
   {
      return value;
   }
}


zero *e1= new a(3);
cout << e1->v();

3 个答案:

答案 0 :(得分:14)

这是安全且完全正确的行为。这就是为什么你有虚拟或纯虚拟方法的原因。大多数情况下,您需要隐藏实现细节并通过其接口(或纯虚拟类)操作对象。这是标准的,所有C ++编译器都必须支持它。

答案 1 :(得分:4)

是的,这是安全的。这是虚函数的重点,它们是在对象的实际类型上调用的,而不是声明的类型。

答案 2 :(得分:1)

这是安全的,但你应该考虑在零或非虚拟保护的析构函数中提供公共虚拟析构函数,具体取决于你是否希望能够通过基指针删除从零派生的对象。

它不仅安全,而且这是继承和多态的主要原因之一:您的零类提供了一个适用于实现它的任何类型的接口,无论它们存储了哪些附加数据以及它们提供了哪些附加功能。通过这个共享接口,可以通过描述所有这些共享方面的公共接口访问和存储实现的多种类型。这是多态性(静态和动态)的本质,是减少在相关类型中工作的冗余代码的一种非常有用的方法。