如何在 C++ 中覆盖函数

Posted

技术标签:

【中文标题】如何在 C++ 中覆盖函数【英文标题】:How to override Function in C++ 【发布时间】:2018-05-19 22:35:42 【问题描述】:

目前,我正在开发 c++ 项目被称为

Parent.h

#ifndef UNTITLED_PARENT_H
#define UNTITLED_PARENT_H


class Parent 

public:
    virtual void printData();
;


#endif 

Parent.cpp

#include "Parent.h"
#include <iostream>
using namespace std;

void Parent::printData() 
    cout<<"Parent"<<endl;

Child.h

#ifndef UNTITLED_CHILD_H
#define UNTITLED_CHILD_H
#include "Parent.h"

class Child : public Parent
public:
    void printData();
;

#endif 

Child.cpp

#include "Child.h"
#include <iostream>
using namespace std;

void Child::printData() 
    cout<<"Child"<<endl;

ParentUser.h

#ifndef UNTITLED_PARENTUSER_H
#define UNTITLED_PARENTUSER_H
#include "Parent.h"

class ParentUser 

public:
    void printer(Parent p);
;

#endif

ParentUser.cpp

#include "ParentUser.h"

void ParentUser::printer(Parent p) 
    p.printData();

ma​​in.cpp

#include <iostream>
#include "Parent.h"
#include "Child.h"
#include "ParentUser.h"

int main() 

    Child child;
    ParentUser parentUser;
    parentUser.printer(child);

    return 0;

【问题讨论】:

让你的论点成为参考,而不是价值——你是object slicing 您观察到的(错误)行为是什么? 观察到的(错误)行为是什么意思? 【参考方案1】:

您的函数void printer(Parent p); 将使用您的编译器自动为您创建的复制构造函数创建Parent 类型的新对象。您需要将其更改为采用 reference

void printer(Parent& p);

这将确保p 实际上是对child 的引用,而不是使用复制构造函数从child 创建的新Parent

这里发生的事情也称为object slicing,因为副本是父类型,它没有在子类中定义的任何成员。

【讨论】:

以上是关于如何在 C++ 中覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何在 C++ 中覆盖文本文件中的数据?

如何让 C++ 与 DRY 完美契合? [关闭]

如何覆盖 C++ 类中的 bool 运算符?

C++多态

如何在 Visual Studio 2010 的 C++ googletest 项目中设置代码覆盖率

不能在函数 C++ 中使用覆盖