首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

C++虚函数继承与重载有关问题

2013-09-28 
C++虚函数继承与重载问题平台环境:VC6.0控制台程序写了简单的一个CFish类,从CFish派生的CSmallFish类,两个

C++虚函数继承与重载问题
平台环境:VC6.0控制台程序
写了简单的一个CFish类,从CFish派生的CSmallFish类,两个类的头文件如下,没有源文件


#pragma once
#include <iostream.h>
class CFish
{
public:
virtual void Breath(){cout<<"Fish breath"<<endl;}
};


#pragma once
#include "Fish.h"
class CSmallFish:public CFish
{
public:
void Breath(){cout<<"SmallFish breath"<<endl;}
};


然后我新建了一个测试类CTest,头文件和源文件如下

#pragma once
#include "SmallFish.h"
class CTest
{
public:
CFish *m_fish;
};


#include "Test.h"
int main()
{
CTest m_test;
m_test.m_fish->Breath();
return 0;
}

问题一:组建编译程序都没有问题,运行的时候出错了。main()函数里面无法通过指针调用
CFish类的Breathe()方法,即m_test.m_fish->Breath();执行失败。
在CTest.h里面不要把m_fish定义成指针,然后main()函数调用m_test.m_fish.Breath()这样是没问题的。函数执行结果为:Fish Breath
求解为什么把m_fish定义成指针的时候,main()函数会执行失败。

问题二:还是和上面一样的代码。
CFish类的Breath()函数是虚函数,CSmallFish里面进行了重载
Test.h里面#include"SmallFish.h",用CFish定义m_fish,
而我要实现的功能是这样:我在主函数里面用m_fish调用CSmallFish的Breath()函数。
即,我要用基函数CFish定义的对象m_fish,来调用派生类CSmallFish里面的Breath函数,这个要如何实现? 继承 指针 vc
[解决办法]
1 没有new对象,m_fish是野指针.出错是自然的事情

2 new一个CSmallFish 给 m_fish 赋值即可
[解决办法]
要想不new就能运行正确需要修改如下
1:virtual?去掉
2:CTest的构造函数里给m_fish初始为NULL
不过最好还是别写这种代码,老老实实new个指针。

多态需要把派生类对象/对象地址赋值给基类对象的引用/指针
[解决办法]
1.问题一:

#pragma once
#include "SmallFish.h"
class CTest
{
public:
CFish m_fish;    // OK
};


2.问题2:

#pragma once
#include "SmallFish.h"
class CTest
{
public:
        CTest(){m_fish = &smallFish;}    
CFish *m_fish;
        CSmallFish smallFish;       // 楼主的意思就是这样的吧!
};

热点排行