C++ 重写虚函数的代码使用注意点+全部知识点

#ifndef VIRTUALFUNCTION_H
#define VIRTUALFUNCTION_H
/*
 *覆盖虚函数的返回值,可以是本类类型的指针或者引用,且父类可转为子类。其他覆盖虚函数,返回类型必须相同,参数类型必须相同,参数类型的顺序必须相同。
 */

class virtualFunction
{
public:
    virtualFunction();
    virtual virtualFunction * own();
    virtual float defaultChange();
    virtual void param(int, double, float);
};

class parentFunction: public virtualFunction
{
public:
    parentFunction * own() override; //正确

    //double defaultChange() override; //报错 conflicting return type
    float defaultChange() override; //正确

    //void param(double, float, int) override;  //报错 maked override, but does not override
    void param(int, double, float) override; //正确

};

#endif // VIRTUALFUNCTION_H

cpp----------------------------------
#include "virtualfunction.h"
#include <QDebug>
virtualFunction::virtualFunction()
{

}

virtualFunction *virtualFunction::own()
{
    qDebug()<<"i am virualFunction son...";
}

float virtualFunction::defaultChange()
{
    qDebug()<<"i am son float...";
}

void virtualFunction::param(int, double, float)
{
    qDebug()<<"i am son , my param order is int - double - float...";
}

parentFunction *parentFunction::own()
{
    qDebug()<<"i am parentFunction father...";
}

void parentFunction::param(int, double, float)
{
    qDebug()<<"i am father, my param order is int - double - float...";
}

float parentFunction::defaultChange()
{
    qDebug()<<"i am father float...";
}

main-------------------------
#include "virtualfunction.h"

int main(void)
{
    virtualFunction *pvf;
    pvf = new parentFunction();
    pvf->own();
    pvf->defaultChange();
    pvf->param(0,0,0);
    //    system("pause");
    return 0;
}
打印结果---------------------
i am parentFunction father...
i am father double...
i am father, my param order is int - double - float...
D:\A_XBS\Qt_project\InheritanceClassPractice\build-inhe

原文地址:https://www.cnblogs.com/azbane/p/11031202.html

时间: 2024-10-29 19:09:50

C++ 重写虚函数的代码使用注意点+全部知识点的相关文章

【C++】子类在重写虚函数时,会覆盖父类的函数

//子类在重写虚函数时,会覆盖父类的函数 #include <iostream> using namespace std; class B { public: B() { cout<<"Create B!"<<endl; } public: virtual void fun() { cout<<"B::fun()"<<endl; } virtual void show() { cout<<&qu

Qt如何重写虚函数

eg:QWidget的有个虚函数,KeyPressEvent,当它的子类获得焦点的时候,如果有任何按键按下,就会触发这个虚函数. 1.在mainwindow.h中声明此虚函数 protected:void KeyPressEvent(QKeyEvent *event): 2.在mainwindow.cpp中重定义此虚函数 void MainWindow::keyPressEvent(QKeyEvent *event) { qDebug()<<"12123"; }

虚函数与纯虚函数的代码解读——2

#include <iostream> #include <string> #include <assert.h> #include <cstring> #include <unistd.h> #include <sys/types.h> #include <signal.h> using namespace std; class Base { public: Base() {cout << "Bas

c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)

总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖不会,仍然调用父类功能. 3:虚方法.实方法都可以被覆盖(new),抽象方法,接口 不可以. 4:抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以. 5:重写使用的频率比较高,实现多态:覆盖用的频率比较低,用于对以前无法修改的类进行继承的时候. 6:关键字:vi

C++中的虚函数、重写与多态

在C++中顺利使用虚函数需掌握的技术细节 如函数在派生类中的定义有别于基类中的定义,而且你希望它成为虚函数,就要为基类的函数声明添加保留字virtual.在派生类的函数声明中,则可以不添加virtual.函数在基类中virtual,在派生类中自动virtual(但为了澄清,最好派生类中也将函数声明标记为virtual,尽管这并非必须). 保留字virtual在函数声明中添加,不要再函数定义中添加. 除非使用保留字virtual,否则不能获得虚函数,也不能获得虚函数的任何好处. 既然虚函数如此好用

转载:C++多态性 &amp; C++纯虚函数

C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言.我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握. 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念.多态(polymorphism),字面意思多种形状. C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里 我觉得要补充,重写的话可

匹夫细说C#:从园友留言到动手实现C#虚函数机制

前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编译成CIL代码的话,对虚函数的调用会使用call而非callvirt: override string ToString() { return Base.ToString(); } 至于为何是这样,匹夫在回复中也做了解释,因为上面那段代码其实相当于是这样的: override string ToSt

【足迹C++primer】52、转换和继承,虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是必不可少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support

【足迹C++primer】52、,转换和继承虚函数

转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding how object-oriented programming works in C++. 理解基类和派生类之间的转换是不可缺少的 理解面向对象编程在. Like built-in pointers, the smart pointer classes (§12.1, p. 450) support