如何在C ++中覆盖函数

时间:2018-05-19 22:35:43

标签: c++ oop inheritance

目前,我正在研究c ++项目我想知道如何发送子类的实例以使用parent作为参数并在子项中执行函数这里是一个例子:我想要Child打印函数被称为

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;
}

1 个答案:

答案 0 :(得分:2)

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

void printer(Parent& p);

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

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