首先是没有涉及虚函数的情况:
对象指针不能指向父类对象
执行同样的函数talk,选择执行指针所指定的talk例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk
</pre></p><p><pre name="code" class="cpp">#include<iostream>
#include<cmath>
using namespace std;
class A{
public:
void talk()
{
cout<<"This is A"<<endl;
}
};
class B:public A
{
public:
void talk()
{
cout<<"This is B"<<endl;
}
};
class C:public B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};
class D:public C
{
public:
void talk()
{
cout<<"This is D"<<endl;
}
};
int main(){
A a;
B b;
C c;
D d;
B *pb;
//pb=&a; (Error!!)
//pb->talk();
pb=&b; //执行B的talk
pb->talk();
pb=&c; //依旧执行B的talk
pb->talk();
pb=&d; //依旧执行B的talk
pb->talk();
a.talk(); //这里只调用他们自己的
b.talk();
c.talk();
d.talk();
//对象指针不能指向父类对象
//执行同样的函数talk,选择执行指针所指定的talk
//例如B *pb,则pb只能指向B或者子类对象,执行相同函数时只执行B的talk
}
然后是涉及虚函数的情况,如果父类中的那个talk是虚函数,则选择调用当前指向的类对象
#include<iostream>
using namespace std;
class A{
public:
void talk()
{
cout<<"This is A"<<endl;
}
};
class B:public A
{
public:
virtual void talk() //虚函数talk
{
cout<<"This is B"<<endl;
}
};
class C:public B //C继承B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};
class D:public B //D继承B
{
public:
void talk()
{
cout<<"This is D"<<endl;
}
};
class E:public D //E继承D,相当于继承B
{
public:
void talk()
{
cout<<"This is E"<<endl;
}
};
int main(){
A a;
B b;
C c;
D d;
E e;
B *pb;
//pb=&a; (Error!!) //依旧不能指向父类
//pb->talk();
pb=&b; //执行B的talk
pb->talk();
pb=&c; //执行C的talk
pb->talk();
pb=&d; //执行D的talk
pb->talk();
pb=&e; //执行D的talk
pb->talk();
}
纯虚函数:定义的时候,不写纯虚函数的实现, 同时这个类被称作抽象类,不能被实例化
virtual void talk()=0;
继承抽象类的派生类,必须对纯虚函数进行实现,否则会报错(如果没加纯虚,则可以不实现的)
#include<iostream>
using namespace std;
class A
{
public:
void talk();
};
class B:public A
{
public:
virtual void talk()=0; //纯虚函数talk
};
class C:public B //C继承B
{
public:
void talk()
{
cout<<"This is C"<<endl;
}
};
class D:public B //D继承B
{
public:
void talk()
{
cout<<"This is D"<<endl;
}
};
class E:public D //E继承D,相当于继承B
{
public:
void talk()
{
cout<<"This is E"<<endl;
}
};
int main(){
A a;
//B b; (Error!)抽象类不可实例化,指针也不行
C c;
D d;
E e;
c.talk();
d.talk();
e.talk();
}