1

Currently, I am working on c++ project I want to know how I can send an instance of a child class to function use parent as a parameter and execute a function in a child here is an example: I want Child print function to be called

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;
}
Mohamed Adel
  • 1,980
  • 17
  • 23

1 Answers1

2

Your function void printer(Parent p); will create a new object of type Parent using a copy constructor your compiler automagically creates for you. You need to change it to take a reference instead:

void printer(Parent& p);

This will make sure that p is actually a reference to child, not a new Parent created from child using a copy constructor.

What's happening here is also called object slicing, as the copy is a parent type, which does not have any of the members defined in the child class.

Max Vollmer
  • 8,412
  • 9
  • 28
  • 43