子类中的 C++ 附加功能不在超类中
c++ additional features in subclass not in superclass
假设我有以下代码:
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,尤其是在主
你的代码中有一些问题。
- 您使用的是
Void
而不是void
。请注意大写与小写的差异。 - 您在
A
中使用Funct1
,但在B
中使用Func1
。您可以将Funct1
更改为Func1
B
末尾缺少一个;
。-
使用
B
而不是new B
。你有:A b = new B;
这是语法不正确的行。你可以做到
A b = B();
或
A* b = new B();
即使在该更改之后,您仍然会遇到所描述的问题。
有两种方法可以解决此问题:
-
使用
B b
代替A b
。B b; b.Func1(); b.Func2();
-
使用
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
.在某些情况下,这甚至可能是一个合法的选择。但是如果你觉得你一直需要它,那么你必须复习你对面向对象编程的理解。
相关文章:
- 模板转换为超类
- 我的超类中的模板问题与结构定义
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 重写另一个方法 [C++] 使用的超类回调函数
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++为API中定义的结构创建超类
- 使用派生类C++方法的超类
- 确保指向超类的指针指向c++中某个子类的对象
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 在从给定超类继承的所有类上调用虚函数
- 如何使 Swig 发出C++超类
- 如何根据构造函数参数使用超类类型初始化成员变量?
- C++:从类型索引中获取超类类型索引
- 为什么编译器找不到超类的方法?
- 无法使用子类变量访问超类公共成员
- 如何将项目放入具有模板化超类类型的向量中
- 超类的成员函数可以访问子类的成员功能吗?如何
- 子类中的 C++ 附加功能不在超类中