C++关于基类指针指向子类对象的问题
2014-08-20 21:50
537 查看
有如下程序:
//-----------------
class A
{
public:
A()
{
printf( "base A\r\n" );
}
virtual ~A()
{
printf( "base ~A\r\n" );
}
public:
virtual void VirtualFunc()
{
printf( "base VirtualFunc\r\n" );
};
void Func()
{
printf( "base Func\r\n" );
}
void F1()
{
printf( "base F1\r\n" );
}
protected:
private:
};
class B : public A
{
public:
B()
{
printf( "derive B\r\n" );
}
~B()
{
printf( "derive ~B\r\n" );
}
public:
virtual void VirtualFunc()
{
printf( "derive VirtualFunc\r\n" );
};
void Func()
{
printf( "derive Func\r\n" );
}
void G1()
{
printf( "derive G1\r\n" );
}
protected:
private:
};
在这两个类中,子类B 重写了 基类的 两个函数,一个是虚函数,一个不是虚函数。
1. 如果main函数如下:
int main(int argc, int* argv[])
{
A* pA = new B; //基类指针指向子类对象
pA->VirtualFunc();
pA->Func();
//pA->G1(); //出错:'G1' : is not a member of 'A'
delete( pA );
system("pause");
return 0;
}
运行结果如下:
base A
derive B
derive VirtualFunc
base Func
derive ~B
base ~A
也就是说,如果子类重写了基类的虚函数,那么该指针(基类指针,但指向派生类对象)将调用子类的函数;
即使子类重写了基类的非虚函数,该指针也不会调用子类的函数。
该指针(基类指针,但指向派生类对象) 也不能调用子类自有的虚函数和非虚函数。
2.
如果main 函数如下:
int main(int argc, int* argv[])
{
B *pB = new B; //子类指针指向子类对象
pB->VirtualFunc();
pB->Func();
//pB->F1(); //正确,输出:base F1。请注意:B类是公有继承A类。具体参见:C++的三种继承方式
delete( pB );
system("pause");
return 0;
}
则运行结果如下:
base A
derive B
derive VirtualFunc
derive Func
derive ~B
base ~A
即如果用子类指针指向子类对象,则都调用子类的函数。
//-----------------
class A
{
public:
A()
{
printf( "base A\r\n" );
}
virtual ~A()
{
printf( "base ~A\r\n" );
}
public:
virtual void VirtualFunc()
{
printf( "base VirtualFunc\r\n" );
};
void Func()
{
printf( "base Func\r\n" );
}
void F1()
{
printf( "base F1\r\n" );
}
protected:
private:
};
class B : public A
{
public:
B()
{
printf( "derive B\r\n" );
}
~B()
{
printf( "derive ~B\r\n" );
}
public:
virtual void VirtualFunc()
{
printf( "derive VirtualFunc\r\n" );
};
void Func()
{
printf( "derive Func\r\n" );
}
void G1()
{
printf( "derive G1\r\n" );
}
protected:
private:
};
在这两个类中,子类B 重写了 基类的 两个函数,一个是虚函数,一个不是虚函数。
1. 如果main函数如下:
int main(int argc, int* argv[])
{
A* pA = new B; //基类指针指向子类对象
pA->VirtualFunc();
pA->Func();
//pA->G1(); //出错:'G1' : is not a member of 'A'
delete( pA );
system("pause");
return 0;
}
运行结果如下:
base A
derive B
derive VirtualFunc
base Func
derive ~B
base ~A
也就是说,如果子类重写了基类的虚函数,那么该指针(基类指针,但指向派生类对象)将调用子类的函数;
即使子类重写了基类的非虚函数,该指针也不会调用子类的函数。
该指针(基类指针,但指向派生类对象) 也不能调用子类自有的虚函数和非虚函数。
2.
如果main 函数如下:
int main(int argc, int* argv[])
{
B *pB = new B; //子类指针指向子类对象
pB->VirtualFunc();
pB->Func();
//pB->F1(); //正确,输出:base F1。请注意:B类是公有继承A类。具体参见:C++的三种继承方式
delete( pB );
system("pause");
return 0;
}
则运行结果如下:
base A
derive B
derive VirtualFunc
derive Func
derive ~B
base ~A
即如果用子类指针指向子类对象,则都调用子类的函数。
相关文章推荐
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- 多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题
- C++关于父类指针指向子类对象的问题
- 多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题
- 基类指针指向子类对象数组的问题
- 基类与派生类,父类指针指向子类对象
- 多重继承下,不同基类指针指向同一子类对象的地址
- 解释为什么基类的析构函数不为虚的话,基类指针指向子类对象,删除对象时,派生类的析构函数就不会被调用
- 《深入详解VC++》第三者 74页关于this指针指向子类的问题
- oc 关于对象release后 指向它的指针如何处理的问题
- 指向子类对象的基类指针调用非虚函数都是基类的函数吗
- [转]基类与派生类,父类指针指向子类对象
- 关于继承类的指针指向基类的内存的问题
- 今天碰到的一个问题,关于通过基类对象的引用给子类赋值
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 关于基类指针、派生类指针、基类对象派、生类对象问题
- 关于通过不含虚析构函数的基类类型的指针删除派生类对象的问题
- 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析(解决面试宝典第四版P147问题)
- 基类指针指向子类对象改如何理解
- 关于const指针和指向const对象的指针的初始化问题