c++ - 如何在 C++ 中重写函数
问题描述
目前,我正在研究 c++ 项目
父母.h
#ifndef UNTITLED_PARENT_H
#define UNTITLED_PARENT_H
class Parent {
public:
virtual void printData();
};
#endif
父级.cpp
#include "Parent.h"
#include <iostream>
using namespace std;
void Parent::printData() {
cout<<"Parent"<<endl;
}
孩子.h
#ifndef UNTITLED_CHILD_H
#define UNTITLED_CHILD_H
#include "Parent.h"
class Child : public Parent{
public:
void printData();
};
#endif
孩子.cpp
#include "Child.h"
#include <iostream>
using namespace std;
void Child::printData() {
cout<<"Child"<<endl;
}
父用户.h
#ifndef UNTITLED_PARENTUSER_H
#define UNTITLED_PARENTUSER_H
#include "Parent.h"
class ParentUser {
public:
void printer(Parent p);
};
#endif
父用户.cpp
#include "ParentUser.h"
void ParentUser::printer(Parent p) {
p.printData();
}
主文件
#include <iostream>
#include "Parent.h"
#include "Child.h"
#include "ParentUser.h"
int main() {
Child child;
ParentUser parentUser;
parentUser.printer(child);
return 0;
}
解决方案
您的函数将使用您的编译器自动为您创建的复制构造函数void printer(Parent p);
创建一个新的类型对象。Parent
您需要将其更改为参考:
void printer(Parent& p);
这将确保它p
实际上是对 的引用,而不是使用复制构造函数创建child
的新引用。Parent
child
这里发生的事情也称为对象切片,因为副本是父类型,它没有在子类中定义的任何成员。
推荐阅读
- c# - 我怎样才能等待最少的时间?
- list - 如何使 flexbox 与 listis 一起工作
- reporting-services - 从两个不同的数据集获取总数到第三个不同的 tablix ssrs
- c++ - 当转换为无符号时,标准说“最小的无符号整数”是结果。为什么“最小”在这里很重要?
- python - 检查熊猫数据框中两列之间的日期和时间
- java - 无法在 Spring Java bean 中注入模拟?
- java - 如何仅从 Point 类中获取 x 和 y
- python - 在 Google Colab 中打开 csv 文件时出现 NaN
- javascript - 删除您没有引用的事件侦听器
- css - 在 Bootstrap 中将图像移动到卡片的右侧