- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
class A
{
protected:
int a;
public:
A();
A(int);
virtual void print()=0;
virtual ~A();
};
class B: public A
{
int b;
public:
B();
B(int,int); //initialize attributes a and b
void print(); //print a and b
};
class C: public A
{
float c;
public:
C();
C(float,int); //initialize attributes a and c
void print(); //print a and c
};
class D
{
int size; //number of objects in v
A **v; /* an array(a vector) of A pointers that allows me to have both B and C type objects */
public:
D();
D(int);
D(D&);
~D();
D operator=(const D&);
void PrintAll();
};
D 的所有方法:
D::D()
{
v=NULL;
}
D::D(int x)
{
size=x;
v=new A*[x];
for(int i=0;i<x;i++)
{
if(i%2==0)
v[i]=new B(4,7);
else
v[i]=new C(3,5);
}
}
D::D(D& other)
{
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
}
D::~D()
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
}
D D::operator=(const D& other)
{
if(v!=NULL)
{
for(int i=0;i<size;i++)
{
delete v[i];
}
delete[] v;
}
size=other.size;
v=new A*[size];
for(int i=0;i<size;i++)
{
if(i%2==0)
{
v[i]=new B();
*v[i]=other.v[i][0];
}
else
{
v[i]=new C();
*v[i]=other.v[i][0];
}
}
return *this;
}
void D::PrintAll()
{
cout<<"Printall():"<<endl;
for(int i=0;i<size;i++)
v[i]->print();
}
如您所见,D 类构造函数使类型为 B 或 C 的对象成为 i 是奇数或偶数。如果我知道这一点,那么我就知道如何为 D 编写 operator= 和 copy constructor。但是如果 D 类构造函数会生成 B 或 C 类型的对象随机地,那么如何为 D 类编写复制构造函数(和 operator=)?我的猜测是我必须使用 typeid 运算符来解决这个问题。
最佳答案
将纯虚方法 clone
定义为接口(interface)的一部分 A
定义 - clone
应返回对象的拷贝。在每个 B
和 C
类中覆盖并实现它。在 D
类中,复制构造函数和赋值运算符实现使用 A
的接口(interface)来创建所需的类实例,而不是显式调用 new
:v[i] = other.v[i]->clone();
。不需要 RTTI
,正常的多态性就可以了。
关于C++:在堆分配之前使用 typeid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788304/
我正在制作一个 C++ 库,它严重依赖 RTTI(可自定义桥接至另一种语言)并且对字符串文字类型非常困惑。 这是我为说明问题所做的一个简单测试: std::cout direct-initializ
我正在使用关联列表来关联 TypeId事件类型的 s 和 TypeId谁想要接收它们。 当我尝试获取 TypeId 时的 Rc , 它给你相同的 TypeId (Rc 中的一个存储了一个 Any )不
答:总之使用虚函数!因此,实际上不要将其用作好的设计,但出于学习目的请阅读! 我想先说我正在使用 C++ 和 Qt我有一个形状指针 vector (基类) 编辑:doSomething() 不是基类的
我正在阅读C++ 11草案标准,关于[expr.typeid]的部分提到了以下内容(强调我的意思): [...] When typeid is applied to an expression oth
使用 gcc 4.9 我发现用字面量为复数生成的类型与通过常规方法创建的类型不同,即: typeid(complex(0.0,1.0)) != typeid(1.0i) 我在这里犯错了吗? 这是编译器
使用 gcc 4.9 我发现使用类型文字生成的复数类型与通过常规方式创建的类型不同,即: typeid(complex(0.0,1.0)) != typeid(1.0i) 我在这里犯错了吗? 这是编译
我正在观看以下 video 这里提到g++对于以下代码会报错: #include #include #include struct S { std::vector b ; }; int mai
我不想使用函数重载来对函数进行小的更改。相反,我想使用typeid()检查下面的模板化函数的传递参数。但是,如果我没有在下面的代码中注释掉该行,则会产生以下编译错误: Severity Code
示例代码: MainWindow::MainWindow(QWidget *parent) { QString strTemp = typeid(this).name();
我有以下代码: #include class Bobo {public: int member; void function() { auto lambda
根据标准,typeid 运算符是依赖于实现的,因此在由不同编译器编译的其他进程创建的对象上使用它是无稽之谈。但是提供进程被同一个编译器编译是什么情况呢? 最佳答案 它可能不会工作,因为外部对象将在它自
class A { protected: int a; public: A(); A(int); virtual void print()=0; virtual
我正在开发实体组件系统,我希望能够使用此方法从实体中检索给定类型的组件: template T* Entity::getComponent() { for( auto i = mCompon
我得到一个有两个基类指针的函数,根据子类,应该调用其他函数...... 像这样: void function(A* a, A* a2){ if (typeid(*a).name() =
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Printing derived class name in base class 我正在使用 GCC,下面
constructor 定义中的print 语句没有打印出来,是不是main 中的constructor 调用正确?我知道我在这里遗漏了一些要点,请指出。 #include #include te
我想知道 typeid 是否是一个“足够硬”的类型安全标准,可以放弃所有通常的预防措施。具体来说,请考虑以下代码片段: class storage { private: std::map ob
我在我的代码中使用了 typeid,但在我看来,如果我避免使用 typeid,代码会更清晰。 如果我们要存储类的类型,为什么我们首先要选择面向对象的语言呢? 但我一遍又一遍地看到这种模式,我不知道如何
我有以下使用 3 个不同映射的类:键始终是字符串,而值可以是字符串、整数或 float 。 class MyMaps { public: template void addKey(const
我想要一个 constexpr 函数,它将为每个 C++ 类型返回一个唯一的 id,如下所示: using typeid_t = uintptr_t; template constexpr type
我是一名优秀的程序员,十分优秀!