我有:
class A{
public:
virtual void foo();
};
class B : public A{
public:
void foo();
};
B *ptr = new B();
Run Code Online (Sandbox Code Playgroud)
我想foo()使用'ptr'指针直接调用A.
当我尝试
(A*)ptr->foo();
Run Code Online (Sandbox Code Playgroud)
它仍然称为B的版本foo().我如何调用A的版本?
这可能吗?有哪些替代方案?谢谢.
class A{
protected:
int var;
};
class B{
protected:
int var;
};
class C : public A, public B {};
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?变量合并吗?我可以调用一个特定的,比如B :: var = 2等.
所以我决定使用工厂设计模式和依赖注入.
class ClassA
{
Object *a, *b, *c;
public:
ClassA(Object *a, Object *b, Object *c) :
a(a), b(b), c(c) {}
};
class ClassB : public ClassA
{
Object *d, *e, *f;
public:
ClassB(Object *a, Object *b, Object *c, Object *d, Object *e, Object *f) :
ClassA(a, b, c), d(d), e(e), f(f) {}
};
Run Code Online (Sandbox Code Playgroud)
现在,问题是classB有太多的构造函数参数.这是一个单继承层示例,但是当继承层开始变深时,并且当每个层类需要构造更多对象时,顶层中的构造函数结束时需要太多参数才能生成!
我知道我可以使用setter而不是构造函数,但还有其他方法吗?
class B;
class A{
B *b;
public:
void operator= (B *b){
this->b = b;
}
};
B *b = new B()
A *a = new A();
a = b;
Run Code Online (Sandbox Code Playgroud)
我收到"无法转换B*为A*"错误.有没有解决的办法?
现在,如果有办法,如果我使用类似的东西:
a = NULL;
Run Code Online (Sandbox Code Playgroud)
将使用哪个运算符"="?