函数与虚函数
- 继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数
- 重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的函数
- 定义一个函数为虚函数是为了允许用 基类的指针 来调用 子类的这个函数。
- 虚函数声明如下:virtual ReturnType FunctionName(Parameter) 虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol “public: virtual void
__thiscall ClassName::virtualFunctionName(void)”
下面是两个虚函数与普通函数的实例,运行看效果
#include <iostream>
using namespace std;
class A {//基类
public:
//虚函数
virtual void fun() { cout << "我是基类函数A:fun" << endl; }
};
class AP : A
{
public:
//虚函数
virtual void fun() { cout << "我是派生类虚函数AP:fun" << endl; }
};
class B {//基类
public:
void fun() { cout << "我是基类函数B:fun" << endl; }
};
class BP : B
{
public:
//函数
void fun() { cout << "我是派生类函数BP:fun" << endl; }
};
int main(int argc, char* argv[])
{
A a;
a.fun();
AP ap;
((A*)&ap)->fun();//虚函数 调用的是派生类的函数 (基类的指针来调用子类的函数)
B b;
b.fun();
BP bp;
((B*)&bp)->fun();//函数 调用的是基类的函数
return 0;
}
输出结果:
我是基类函数A:fun
我是派生类虚函数AP:fun
我是基类函数B:fun
我是基类函数B:fun
#include<iostream>
using namespace std;
class A
{
public:
virtual void foo()
{
cout << "A::foo() is called" << endl;
}
};
class B :public A
{
public:
void foo()
{
cout << "B::foo() is called" << endl;
}
};
int main(void)
{
A* a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! (基类的指针来调用子类的函数)
return 0;
}
纯虚函数
在很多情况下,基类本身生成对象是不合情理的(基类不可实例化)。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。所以动物要用纯虚函数。纯虚函数只在基类中声明,它在基类中没有定义,但要求任何派生类都要重新声明,定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加 =0:
virtual void funtion1()=0
原文地址: https://www.runoob.com/w3cnote/cpp-virtual-functions.html
https://blog.csdn.net/guyue35/article/details/50774385
https://blog.csdn.net/hackbuteer1/article/details/7558868