c++ 非虚函数 虚函数 纯虚函数

函数与虚函数

  1. 继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数
  2. 重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的函数
  3. 定义一个函数为虚函数是为了允许用 基类的指针 来调用 子类的这个函数
  4. 虚函数声明如下: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值