指向对象的指针的函数调用问题(含虚函数和纯虚函数知识)
2016-09-02 11:09
323 查看
首先是没有涉及虚函数的情况:
对象指针不能指向父类对象
执行同样的函数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();
}
![](https://img-blog.csdn.net/20160902150310298?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
纯虚函数:定义的时候,不写纯虚函数的实现, 同时这个类被称作抽象类,不能被实例化
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();
}
对象指针不能指向父类对象
执行同样的函数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();
}
相关文章推荐
- this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- 指向子类对象的基类指针调用非虚函数都是基类的函数吗
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- 当父类指针指向子类对象时的函数调用
- 函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针 问题解析
- 关于基类指针指向子类对象,构造函数和析构函数调用的顺序的问题。
- VC++之对象含指针成员指向堆空间并调用复制构造函数问题—参考范磊VC++
- 当指针并没有指向实际的对象时,能否调用对象的成员函数
- C基础知识之理解指向函数的指针
- Inside VCL:接口指针调用函数的时候,如何获得对象指针以完成函数调用?
- 关于const指针和指向const对象的指针的初始化问题
- 指向函数的指针问题(一般函数和类函数)
- 对象的引用调用private类型函数的问题
- 基类指针指向子类对象数组的问题
- B继承自A,A指针无法隐式转换为B指针,函数参数只管指针类型,与实际指向对象无关
- 关于指针的一些知识,记多维数组指针、指针数组、指针的指针和指向函数的指针
- 指向对象的指针访问成员函数
- 指向函数的指针,重温大一的C知识
- 指向函数的指针问题(一般函数和类函数)