继承c ++ upcasting

时间:2017-01-14 17:38:14

标签: c++ inheritance

我对此代码有点问题:

#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");
}

你能告诉我是否有办法在A类中定义一个对象B并使用它的方法如下:

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

    B bclass;
};

在main函数中使用类似:

int main() {

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

    system("PAUSE");
}

3 个答案:

答案 0 :(得分:3)

你需要问自己的问题

编译器如何计算A

的大小

嗯 - 需要弄清楚B

的大小

B中有A

你可以永远绕过那个循环

所以你不能这样做。

所以使用指针和转发声明

答案 1 :(得分:0)

通常,函数定义放在cpp文件和hhpp文件中的类定义中。

cpp个文件中,您同时包含两个类hpp

cpp中定义的每个函数都可以看到这两个类的定义,并且可以创建新的类。

但是在声明中你只能使用指针或对该类对象的引用。

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

主要:

int main() {

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

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


    system("PAUSE");
}
  

this link所有工作示例都在一个文件中。

     

one else link似乎使用了Visual Studio编译器。

答案 2 :(得分:-1)

仅为示例,您可以使用指针指向A实例(如下所示)中的B实例:

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

    std::unique_ptr<B> bclass;
};

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

唯一指针将管理内存释放。