错误代码:
#include<iostream>
using namespace std;
class BaseClass
{
public:
BaseClass(){cout<<"BaseClass constructor "<<endl;}
void fn1(){cout<<"Base1"<<endl;}
void fn2(){cout<<"Base2"<<endl;}
~BaseClass(){cout<<"BaseClass destructor"<<endl;}
};
class DerivedClass
{
public:
DerivedClass(){cout<<" DerivedClass constructor"<<endl;}
void fn1(){cout<<"DerivedClass 1"<<endl;}
void fn2(){cout<<"DerivedClass 2"<<endl;}
~DerivedClass(){cout<<"DerivedClass destructor"<<endl;}
};
int main()
{
DerivedClass d;
DerivedClass *dd=&d;
BaseClass *b=&d; //出现编译错误?
d.fn1();d.fn2();
dd->fn1();dd->fn2();
b->fn1();b->fn2();
return 0;
}
在下面的代码中也有同样的错误(与答案一致,但在编译中出错)
而下面的代码则运行结果一切正常:
#include<iostream>
using namespace std;
class Base1 //声明基类Base1
{
public:
virtual void display()const; //将虚函数display()声明为const型函数
};
void Base1::display() const
{
cout<<"Base1::display()"<<endl;
}
class Base2:public Base1{ //声明直接基类Base2
public:
void display()const;
};
void Base2::display() const
{
cout<<"Base2::display"<<endl;
}
class Derived:public Base2{ //声明派生类Derived
public:
void display()const;
};
void Derived::display() const
{
cout<<"Base3::display"<<endl;
}
void fun(Base1 *ptr) //使用基类的指针调用虚函数
{
ptr->display();
}
int main()
{
Base1 base1;
Base2 base2;
Derived derived;
fun(&base1); //用Base1对象的指针调用fun函数
fun(&base2); //用Base2对象的指针调用fun函数
fun(&derived); //用Derived对象的指针调用fun函数
return 0;
}
运行结果:
emmm,然后发现是由于忘声明了继承与派生关系