C++ 继承c++;向上投射

C++ 继承c++;向上投射,c++,inheritance,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();

我对这段代码有点问题:

#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

但是
B
中有一个
A

你可以永远绕着那个圈子转

所以你不能这么做


因此,使用指针和前向声明

通常函数定义放在
cpp
文件中,类定义放在
h
hpp
文件中

cpp
文件中,两个类都包含
hpp

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

但在声明中,您只能使用指向该类对象的指针或引用

==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";
}
工作示例在一个文件中完全可用

这里似乎使用了VisualStudio编译器


对于示例,您可以使用指针从a实例指向B实例,如下所示:

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

    std::unique_ptr<B> bclass;
};

A a;
A.bclass=new B;
A.bclass->PrintB();
A类{
公众:
void PrintA(){
std::cout PrintB();


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

不,A不能包含B对象,因为B是从A派生的,但它可以包含指向一个对象的指针。请给我一个例子,我试图在谷歌上找到一些,但不清楚…如何制作这个指针?你会在这里找到大量使用指针的例子:你问
我有一个pr用这段代码出现问题,然后你展示代码。然后你给出一个你想尝试的选项或方法的场景,然后展示你想如何在你的main中使用它。我看到缺少的是原始代码的实际问题?你从来没有清楚地说明问题是什么,也没有展示你的程序的任何输出oes和一个输出作为它的目的应该是什么的参考。因此,我认为这个问题是不确定的或者太模糊了。我试着做一些像B*bclass=new B的东西,但它说的是未定义的类型B。PS:我使用前向声明now@zVoxty这很可能是因为在定义A时B还没有被定义死记硬背,您需要前向声明来指示B存在并将在以后定义。您刚才所说的是关于继承的。不可能使用
class A:public B{}
class B:public A{}
。但作者似乎不需要这样的递归闭合图。要么B是a的成员,要么B继承a-因此B需要以任何方式包含a的数据。至于外部世界的观点,这是不同的question@zVoxty:那么我想知道您是如何搜索的,在哪里搜索的,因为当我输入“forward declaration c++”时在谷歌,第一个结果已经把我带到了一个堆栈溢出页面,上面有一个完美的工作示例,答案是195票。这是我不能做的如果我在类A中声明像:B*bclass=new B这样的指针,这就不起作用了;这就是我在类A中声明和定义指针B所需要的:-?@JeandeyBoris我用
std::unique\u ptr
改进了你的答案。这与OP的问题无关。为什么?OP问如何
A.bclass->PrintB()
我的示例显示了
a.b->PrintB()
。请澄清。转到我刚刚发布的链接,按
编译
运行
。查看结果。然后转到您的开发环境并再次检查代码。@oklas,因为您在我的评论之后对其进行了大量编辑。我尝试了该链接并工作,但在visual studio 15中使用了所述的单位化局部变量“a”
#include "a.hpp"
#include "b.hpp"

void A::PrintA() {
    b = new B();
    std::cout << "A";
}
#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");
}
class A {
public:
    void PrintA() {
        std::cout << "A";
    }

    std::unique_ptr<B> bclass;
};

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