Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果虚函数引用C+中派生类中的变量,是否安全+;?_C++_Visual C++ - Fatal编程技术网

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

C++ 如果虚函数引用C+中派生类中的变量,是否安全+;?,c++,visual-c++,C++,Visual C++,当导出时,将被投射回基础中。 通过安全,我的意思是它对已知的C++编译器工作正常。 它似乎是为Visual C++ 2008工作的。 例如 零级 { 虚拟int v()=0; } a类:公共零 { 公众: int值; a(整数vin) { 值=vin; } int v() { 返回值; } } 零*e1=新的a(3); cout v(); 这是一种安全且完全正确的行为。这就是为什么有虚拟或纯虚拟方法的原因。大多数情况下,您希望隐藏实现细节,并通过对象的接口(或纯虚拟类)操纵对象。这是标准,所有C

当导出时,将被投射回基础中。 通过安全,我的意思是它对已知的C++编译器工作正常。 它似乎是为Visual C++ 2008工作的。 例如

零级
{
虚拟int v()=0;
}
a类:公共零
{
公众:
int值;
a(整数vin)
{
值=vin;
}
int v()
{
返回值;
}
}
零*e1=新的a(3);
cout v();

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

< P>是的,它是安全的。这就是虚函数的全部要点,它们是根据对象的实际类型调用的,不是声明类型。

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


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

应该首先是代码>类A<代码> >代码>类0 < /C> > @ Neal.C.I修改了原来的问题,没有Visual C++ 2009这样的东西。你是说2008年吗?不是很重要,你更新的代码在任何兼容C++编译器中都很好。使用它作为接口,这是很清楚的。我不清楚派生类中定义的变量会发生什么变化。看起来它们似乎被某种方式保留了下来。@Aftershock注意e1的类型是指向零的指针。请注意,它指向的是类型a(从创建到销毁)。指针的类型不会改变它指向的对象的类型,因为对象一旦创建就不会改变类型。您给出的原始示例只是一个多态性的教科书示例(google提供的相关信息的好关键字)。@jdehaan所说的也适用于您将遇到的大多数OO语言。
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();