我有两个类A和B,还有一个类AVector来存储A类的对象和从A类派生的类。
#include <iostream>
#include <vector>
class A {
private:
int id_;
public:
A(int id);
int id() { return id_; }
};
A::A(int id) : id_{id} {}
class B : public A {
private:
public:
B(int id);
std::string sayHello() { return "Hello"; }
};
B::B(int id) : A(id) {}
class AVector : private std::vector<A> {
private:
public:
void push_back(const A& inv);
using std::vector<A>::size;
using std::vector<A>::at;
using std::vector<A>::begin;
using std::vector<A>::end;
};
void AVector::push_back(const A& a) {
std::vector<A>::push_back(a);
}
int main()
{
A a1(3);
A a2(8);
B b1(12);
std::cout << b1.sayHello() << std::endl; // Hello
AVector av;
av.push_back(a1);
av.push_back(a2);
av.push_back(b1);
// std::cout << "id b1 = " << (av.at(2)).sayHello() << std::endl; // error
// main.cpp: In function ‘int main()’:
// main.cpp:54:43: error: ‘__gnu_cxx::__alloc_traits >::value_type {aka class A}’ has no member named ‘sayHello’
// std::cout << "id b1 = " << (av.at(2)).sayHello() << std::endl; // error
A *a_ref = &(av.at(1));
std::cout << "id a_ref(a1) = " << a_ref->id() << std::endl; // id a_ref(a1) = 8
// B *b_ref = &(av.at(2)); // error
// main.cpp: In function ‘int main()’:
// main.cpp:60:16: error: invalid conversion from ‘__gnu_cxx::__alloc_traits >::value_type* {aka A*}’ to ‘B*’ [-fpermissive]
// B *b_ref = &(av.at(2)); // error
}
在将B类型的对象放入AVector后,我无法将其强制转换回B类型。在将对象b1保存到AVector中后,有关派生类的所有信息都丢失了吗?我是否可以访问类B中实现的方法?
向量的对象具有
av.at(2).sayHello()
说不通。
也许您来自一种默认使用虚拟方法的语言,比如Java。在C++中不是这样的。
此外,即使您将方法变为虚拟的,它仍然不够好,因为向量只存储
问题内容: 如何使用C ++从派生类调用父函数?例如,我有一个名为的类,一个名为的类是从父类派生的。每个类中都有一个print函数。在定义孩子的打印功能时,我想调用父母的打印功能。我将如何去做呢? 问题答案: 我冒着明显的危险:调用该函数,如果它在基类中定义,则该函数在派生类中自动可用(除非它是private)。 如果派生类中有一个具有相同签名的函数,则可以通过在基类名称后加上两个冒号来消除歧义。
我可以写: 但这当然不起作用,因为调用返回的是而不是我想要的。 我可以通过在(以及和等)中键入类型并抑制警告来避免这个问题,但是即使只有(比方说)10个扩展的实体类,这仍然是为了键入而编写的样板代码。此外,我认为,如果我必须为每个派生类编写代码(无论多么小)(也会有其他类似的方法),那么拥有类层次结构的好处就会丧失很多。 对此有更好的解决方案吗? 更新:使用Java7。
我学会了通过存储基类指针将派生类指针存储在基类向量中: 但是如果我有一个抽象基类: 从中派生出另外两个抽象类。 以及来自二级抽象类的其他几个派生类: 是否有可能将它们全部存储在多态性载体中?和往常一样,我做了以下工作: 但是如何将两个多态向量存储在基类向量中呢?
我有一个应用程序,它由一个服务器组成,该服务器可以有多个两种类型的客户端,即用户客户端和设备客户端。为此,我有一个客户端基类的向量,我将在其中添加新客户端,因为它们连接到服务器。这是我所拥有的简化版本: 我有下面的UML表示: 我怀疑这张图是否代表了正确的意图。也许我对UML不是很有经验,这就足够了,但是我认为这个图没有清楚地描述服务器中的向量将包含用户和设备而不是客户端的事实。我不知道我是否需要
数据结构是指若干个数据的连接方式,一个复杂的数据往往是由若干个不同类型数据形成的结构。派生类型是指用户利用FORTRAN系统内部类型,如数值型、逻辑型、字符型等自行设计出一个新的数据类型,它们实际上是由内部类型数据形成的某种结构。本章主要目的是学会按复杂数据的客观结构形态,由程序员定义出一种派生类型,再结合上将在后面叙述的模块后,可将该类型必需的操作写成内部子程序,连同派生类型一起写在模块中,供程
我仍然试图掌握抽象基类的概念,以及从派生类中可以做什么和不能做什么。 我有以下代码: 基类中的示例- 在派生类中
我有2种类型的类型类,其中一种类型包含另一种类型 我想这样称呼我的类型类: 但这行不通。 错误:(34,23)找不到参数e的隐式值:com.playground.Valides[com.playground.MyModel1,model.version.type]val v=隐式[Valides[MyModel1,model.version.type]]错误:(34,23)没有足够的隐式方法参数:
其实,类似的问题这里问过,那里问过,但回答都不满意。代码示例是 输出为 关于 由于是虚函数,派生类不实现它,因此程序将调用; 则程序将调用; 是一个常规函数,程序将调用; 也是一个常规函数,程序将调用; 我不明白的部分来了,不是虚函数,是属于的指针,基本上只能访问中的函数!但输出是 相比之下,会像我想的那样调用。 在基类指针只能访问基类和虚函数中定义的函数的原则与实际输出之间似乎存在矛盾。原因也无