子类中的 C++ 附加功能不在超类中

c++ additional features in subclass not in superclass

本文关键字:超类 功能 C++ 子类      更新时间:2023-10-16

假设我有以下代码:

class A 
{
     public:
         void Funct1();
};
class B : public A
{
      public:
          void Func1();
          void Func2();
}

在主()

声明类型 A 的对象

  A b = new B;
  b.Func1() // can access it;
  b.Func2() // cannot access

如何使用对象 b 制作或访问 Func2,尤其是在主

你的代码中有一些问题。

  1. 您使用的是Void而不是void。请注意大写与小写的差异。
  2. 您在A中使用Funct1,但在B中使用Func1。您可以将Funct1更改为Func1
  3. B末尾缺少一个;
  4. 使用 B 而不是 new B 。你有:

    A b = new B;
    

    这是语法不正确的行。你可以做到

    A b = B();
    

    A* b = new B();
    

即使在该更改之后,您仍然会遇到所描述的问题。

有两种方法可以解决此问题:

  1. 使用 B b 代替A b

    B b;
    b.Func1();
    b.Func2();
    
  2. 使用virtual成员函数。

     class A 
     {
          Public:
              void Func1();
              virtual void Func2();
     };
     class B : public A
     {
           Public:
               void Func1();
               virtual void Func2();
     };
    

    然后,您可以使用:

    B b;
    A* aPtr = &b;
    aPtr->Func1();
    aPtr->Func2();
    

您可以使用static_cast

A *b = new B;
B *bb = static_cast<B*> (b);

通过BB,您可以访问Func2()

编写一个获取类型为 A 的参数的函数。然后你可以向这个函数发送一个 A 或 B 类型的参数,多态性有效,类 A 或 B 中的函数可以按照你想要的方式工作。

在像 C++ 这样的静态类型语言中,只能调用与当前作用域中对象的静态类型对应的方法。在 main 中,您使用静态类型 A 声明了 b,将其限制为类 A 中定义的接口。如果你想要多态性,你需要在 A 中声明多态函数,并添加 virtual 关键字。

如果面向对象编程对你试图解决的问题没有意义,请不要使用它。在C++中,您不需要将所有内容都放在类中,更不用说在类层次结构中了。从简单的独立函数开始,如果需要,可以使用类。

话虽如此,如果您真的坚持,请使用 dynamic_cast .在某些情况下,这甚至可能是一个合法的选择。但是如果你觉得你一直需要它,那么你必须复习你对面向对象编程的理解。