如何在 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();
main.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++ 中覆盖函数的主要内容,如果未能解决你的问题,请参考以下文章