继承 c++ 向上转换

Inheritance c++ upcasting

本文关键字:转换 c++ 继承      更新时间:2023-10-16

我对这段代码有一点问题:

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

并在主函数中使用类似的东西:

int main() {
    A a;
    a.bclass->PrintB();
    system("PAUSE");
}
你需要

问自己的问题

编译器如何计算A的大小

好吧 - 它需要弄清楚B的大小

B有一个A

你可以永远绕着这个循环

所以你不能这样做。

所以使用指针和前向声明

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

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

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

此链接中提供的工作示例全部在一个文件中。

还有一个链接,似乎使用了Visual Studio编译器。

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

class A {
public:
    void PrintA() {
        std::cout << "A";
    }
    std::unique_ptr<B> bclass;
};
A a;
A.bclass=new B;
A.bclass->PrintB();

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