重载运算符[]多态性
Overloading operator [] polymorphism
class Base
{
protected:
string m_Name;
public:
virtual string Name() { return m_Name; }
virtual string Type() = 0;
virtual bool isEqual(Base* rhs) = 0 ;
};
我有一个抽象类Base。我的代码中的不同类继承自这个基类。我将这些对象存储在一个容器(Base的指针向量(中
struct Container
{
vector<Base*> vec;
int Count() { return vec.size(); }
Base* operator[](int i)
{
if (i<=0) throw anexception;
if (i>=vec.size()) throw anexception;
return vec[i];
}
};
我重载了运算符[],但只返回了一个指针。有没有一种方法可以让我返回对象vec[I](它是从Base继承的类型(?
如果您希望返回vec[i]
:指向的对象,您可以简单地返回一个引用
Base& operator[](int i)
{
if (i<=0) throw anexception;
if (i>=vec.size()) throw anexception;
return *vec[i];
}
但是,在不知道派生类型的情况下,不能返回对象的副本,因为这需要从旧对象构造一个新的Base
,而这是不可能的,因为Base
是抽象的。
您不应该这样做。
返回类的实例意味着您需要调用复制或移动构造函数。如果您这样做了,那么您将调用基类的复制构造函数。由于基类不知道派生类,因此返回的副本将是派生类的sliced
版本。
这意味着,如果派生类具有基类中不存在的变量,则它们将被忽略。更不用说虚拟函数将是基类的函数。
你可以返回一个引用,但我看不出它会比返回一个指针更好。如果你不小心使用引用,你肯定会接触到切片。
您可以编写一个函数来指定所需的类型:
struct Container
{
...
template<typename T>
T* at(int i)
{
...
return dynamic_cast<T*>(vec[i]);
}
};
Container c;
Derived1* d = c.at<Derived1>(3);
如果对象确实是指定类型的,则返回一个有效指针,否则返回一个空指针。
但是,您可以而不是使用operator[]
执行此操作。
通常,通过指向基类的指针访问的多态对象的类型在运行时是未知的。从基类到类型派生类的唯一方法是使用switch语句的形式来处理所有可能的派生类:
Base* p = ...;
if(dynamic_cast<Derived1*>(p)) { ... }
else if(dynamic_cast<Derived2*>(p)) { ... }
else if(dynamic_cast<Derived3*>(p)) { ... }
else { ERROR }
这当然是你想要避免的事情。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 运行时多态性 - 箭头运算符访问了错误的成员?
- 将多态性与运算符 + 重载模板化类结合使用.如何实现基类?
- 具有虚拟赋值运算符的多态性
- 如何用复数和多态性重载运算符
- 正确执行运算符重载和多态性
- 类多态性和相等运算符
- 过载==和!=C++中具有多态性的运算符
- 动态多态性和运算符重载的真实示例
- C++运算符重载和多态性
- C++:多态性和运算符重载
- c++中的多态性和运算符重载混淆
- 重载运算符[]多态性
- C++强制运算符重载和多态性