虚函数调用的几种方式,及虚函数的重载、跨类重载问题。
/*
虚函数的三种调用方式
1:指针
2: 引用
3:对象(不能实现多态)
*/
#include<iostream>
using namespace std;
//继承,默认情况下class是私有继承 struct默认是公有继承
//虚函数可以调用成员函数
//多态调用依赖于指针 或 引用调用
//对象的调用有副本机制,会调用拷贝构造,拷贝一个父类,无法实现多态。
//p->go(); //多态调用
//p->myclass::go(); //原生调用
//虚函数重载和返回值无关,和参数个数,顺序有关。
//虚函数被继承下来了还是虚函数。
//如果要使用被继承的虚函数,不允许出现虚函数 重载 ,是C++编译器的问题。
//多态可以跨类。爷爷辈的指针,可以存储孙子辈的地址、父辈拔针的地址
class myclass
{
public:
int i = 0;
virtual void go()
{
i = 0;
show();
}
void show()
{
cout << "myclass->show" << endl;
}
virtual ~myclass()
{
//不加virtual 会内存泄露。
}
};
class newmyclass :public myclass
{
public:
void go()
{
cout << "newmyclass->go" << endl;
}
void show()
{
cout << "newmyclass->show" << endl;
}
void put()
{
cout << "newmyclass->show" << endl;
}
};
//1:指针
void test1(myclass *p)
{
p->go();
}
//2:引用
void test2(myclass &p)
{
p.go();
}
//3:对象
void test3(myclass my)//对象做为参数,会使用拷贝构造,
{
my.go();
}
void main()
{
//newmyclass my;
//my.go();
myclass *p = new newmyclass;
p->go();
p->myclass::go(); //父类的go();
cin.get();
}