c++的一点问题

来源:百度知道 编辑:UC知道 时间:2024/06/29 21:32:39
class n1
{
public:

};
class n2:public n1
{
public:
virtual void ii();(重载n1类的成员函数)
};

void n2::ii()
{
cout<<'2'<<endl;
}

n2 nn;(全局对象)

我问题是:n2类里一点也不改动,只在n1类里做文章,建立完nn时,程序执行的是n2类里的ii()函数,而不是n1类里的ii()函数.n1类里我没写ii().不管n1类里怎么写,最后建立完nn对象时程序自动执行n2里的重载n1类的n2::ii()函数;谢谢
好像没有人理解我的意思,我要执行的是n2的ii()函数,那个n2 nn一创建就会自动执行n2的ii()函数,n2 nn创对象到此为止,以下什么都不写,我问这个问题在于:微软公司的人能这种情况下只在基类里做文章,一创建对象就会自动调用派生类的ii()函数,我很不理解,它们把基类封装了,我看不到,我就来问问大家.谢谢

我理解你的意思了.但是还是没实现.我的想法如下,如果真的能实现,请发表一下,最好指出我想法的错误,在下感激涕零!
一般来说,
在 n1 里写一个 virtual void ii(); 然后在 n2 里重载(这一步你已经做了),
n2 nn;
第一,创建时首先调用基类 n1 的构造函数 n1() ;
如果在基类里调用了 ii(),我认为只能是在调用 n1() 时调用了 ii(),亦即在 n1() 里调用 ii();
而如果要想在这里调用 n2 的 ii(),基类就要得到 n2 的对象或指针,而且要只能通过传参得到,而这又是得不到的.这有两种形式:
1. n1(n1 nn1)或n1(n1&nn1)
{
nn2.ii(); // 若传来的参数是 n2 的对象,这样调用的就是 n2 的 ii()
}
但这是行不通的,因为类 n2 还没声明,即使使用前向引用声明也因
n2 声明不完全而出错.
2. n1(n1 * p)
{ p->ii(); } // 若实参是 n2 的指针,这样调用的也是 n2 的 ii()
而这也是行不通的,因为这样的传的方式只能是如下这样:
// 在 n2 的构造函数中使用初始化列表给 n1() 传参
n2::n2():n1(n2*p){}
这是非法使用,还是因为类 n2 尚未声明不完全.
所以,我感觉这好象实现起来有一定困难,若有新的观点请不吝赐教!

class n1
{
public:
virtual void ii(){} //函数名称参数返回值

};
class n2:public n1
{
public:
virtual void ii();(重载n1类的成员函数)
};

void n2::ii()
{
cout<&l