C++ 在C+中的派生类之间切换+;
这是我能找到的最接近真实的东西。然而,答案仍然给我留下了疑问 下面是一个代码示例:C++ 在C+中的派生类之间切换+;,c++,inheritance,C++,Inheritance,这是我能找到的最接近真实的东西。然而,答案仍然给我留下了疑问 下面是一个代码示例: class A { A() {} virtual void print() = 0; } class B : public A { B() {} void print() { printf("B"); } } class C : public A { C() {} void print() { printf("C"); } } int main() { A** n;
class A {
A() {}
virtual void print() = 0;
}
class B : public A {
B() {}
void print() { printf("B"); }
}
class C : public A {
C() {}
void print() { printf("C"); }
}
int main() {
A** n;
n = new A*[4];
n[0] = new B;
n[1] = new C;
n[2] = new B;
n[3] = new C;
for(int i = 0; i < 4; i++)
n[i]->print();
printf("\n");
delete n[0];
delete n[1];
delete n[2];
delete n[3];
delete [] n;
}
因此,当您打印出阵列时,您现在可以得到“BCCC”。我在链接的帖子中读到,必须这样做是设计拙劣的证据。如果是这样的话,可以解释一下吗?对我来说,这似乎是一个面向对象设计的常见用例。假设所有属性都在基类中定义。类的唯一区别在于方法的实现
如果C++不支持在运行时改变这样的对象类型,那么获得相似结果的方法是什么?
< P>指针指向的对象<代码> N[2 ] < /C> >是<代码> B< /Cord>对象。它不能神奇地变成C
对象。如果你想要一个C
对象,你必须创建一个。但是,不要忘记删除现有的B
对象
delete n[2];
n[2] = new C;
我不相信你可以从B类转换到C类。这两个类也是A类,因为在B中是A,C是A,但是B不是C,C不是B。两者都可以转换到A中,但由于切片问题,这是一种危险的做法。在这种情况下,通过强制转换,派生类中没有要丢失的数据,因此不会丢失任何东西。但是,为了调用父类方法,不需要将B或C强制转换为a
也许可以编写一个以B对象作为输入并返回C对象的函数,以及一个以C对象并返回B对象的函数,但您必须自己手动将一个对象转换为另一个对象 最接近的方法是在B和C构造函数中实现,该构造函数将接受A(或A*)作为输入,并将所需的任何数据复制到新对象中。那么你应该得到这样的东西
A* temp = n[2];
n[2] = new C(A);
delete temp;
但更好的解决方案是创建一个包含数据的类和一个*指向一个实现不同数据操作方式的类。一旦创建了对象,就不能真正更改对象的类型。但这并不意味着不能在运行时更改行为。你需要做的是重构你的代码
class A;
class ImplA
{
public:
void print (A&) = 0;
};
class A
{
std::unique_ptr<ImplA> impl;
public:
A (ImplA* ia) : impl(ia)
{}
void print()
{
impl->print(*this);
}
void changeImpl (ImplA* ia)
{
impl.reset(ia);
}
};
A类;
类ImplA
{
公众:
无效打印(A&)=0;
};
甲级
{
std::唯一的\u ptr impl;
公众:
A(ImplA*ia):impl(ia)
{}
作废打印()
{
执行->打印(*此);
}
无效变更通知(通知*ia)
{
执行复位(ia);
}
};
这当然是使用C++11的智能指针,但不管怎样,想法都是一样的。你应用软件工程的基本原理:抽象改变的事物
我建议你仔细阅读设计模式。它将在不破坏OOP工作方式的情况下为您提供一些想法,让您可以做您想做的事情。C++不支持在运行时更改对象类型。当对象被扭曲时,它将被修复。@PlasmaHH:n[i]是指针。我们不能使用子指针指向父指针吗?
class A;
class ImplA
{
public:
void print (A&) = 0;
};
class A
{
std::unique_ptr<ImplA> impl;
public:
A (ImplA* ia) : impl(ia)
{}
void print()
{
impl->print(*this);
}
void changeImpl (ImplA* ia)
{
impl.reset(ia);
}
};