zVoxty
zVoxty

Reputation: 39

Inheritance c++ upcasting

I have a little problem with this code :

#include <iostream>

class A {
public:
    void PrintA() {
        std::cout << "A";
    }
};

class B : public A {
public:
    void PrintB() {
        std::cout << "B";
    }
};

int main() {

    A a;
    a.PrintA();

    B b;
    b.PrintA();
    b.PrintB();


    system("PAUSE");
}

Can you tell me if there exist a way to define in A class an object B and use it's methods something like :

class A {
public:
    void PrintA() {
        std::cout << "A";
    }

    B bclass;
};

And use in main function something like :

int main() {

    A a;
    a.bclass->PrintB();

    system("PAUSE");
}

Upvotes: 3

Views: 148

Answers (3)

oklas
oklas

Reputation: 8240

Generally functions definition is placed in cpp files and class definition in h or hpp files.

In cpp files you include both hpp with both classes.

Each function defined in cpp have see definition of both classes and may create new one of them.

But in declaration you may only use pointer or reference to object of that class.

== a.hpp ==

#pragma once

class B;
class A {
public:
    void PrintA();
    B* b;
};

== b.hpp ==

#pragma once

#include "a.hpp"

class B : public A {
public:
    void PrintB();
    A* a;
};

== a.cpp ==

#include "a.hpp"
#include "b.hpp"

void A::PrintA() {
    b = new B();
    std::cout << "A";
}

== b.cpp ==

#include "a.hpp"
#include "b.hpp"

void B::PrintB() {
    a = new A();
    std::cout << "A";
}

And main:

int main() {

    A a;
    a.PrintA();
    a.b->PrintB();

    B b;
    b.PrintA();
    b.PrintB();


    system("PAUSE");
}

Worked example available at this link all in one file.

There one else link where seems Visual Studio compiler used.

Upvotes: 0

Jeandey Boris
Jeandey Boris

Reputation: 743

Just for a sample, you can point to a B instance from an A instance like below, with a pointer:

class A {
public:
    void PrintA() {
        std::cout << "A";
    }

    std::unique_ptr<B> bclass;
};

A a;
A.bclass=new B;
A.bclass->PrintB();

The unique pointer will manage memory deallocation.

Upvotes: -1

Ed Heal
Ed Heal

Reputation: 60017

The question you need to ask yourself

How does the compiler figure out the size of A

Well - It needs to figure out the size of B

But B has an A in it.

You can go around that loop forever

So you cannot do it.

So use a pointer and forward declaration

Upvotes: 3

Related Questions