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();