【问题标题】:How to override Function in C++如何在 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
  • 您观察到的(错误)行为是什么?
  • 观察到的(错误)行为是什么意思?

标签: c++ oop inheritance


【解决方案1】:

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

void printer(Parent& p);

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

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

【讨论】:

    猜你喜欢
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多