我有A班:
class A
{
A(const String& name)
{
doSomething1();
}
}
我也有B级
class B : A
{
B(const String& name): A(name)
{
doSomething2();
}
}
因此,如果我调用B(),它也会调用A(),并且会产生2x调用doSomething()。 有没有办法如何在A`s构造函数中发现它被直接调用如:A()和间接调用:B()?
由于
修改 好吧,这不是同一个方法doSomething()它更像是doSomething1()和doSomething2()但是我想调用最多的外部函数,所以如果A有doSomething1()和B doSomething2(),在调用B()后我想要执行doSomething2()
答案 0 :(得分:3)
一般情况下,如果您所指的对象是派生类型,则无法从基类中发现。
无论如何,你的设计很有可能存在缺陷,这样的事情也可以起作用:
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A(const string& name)
{
doSomethingFromA();
}
void doSomethingFromA() {
cout << "called from A" << endl;
};
protected:
A(const string& name, bool fromB)
{
doSomethingFromB();
}
void doSomethingFromB() {
cout << "called from B" << endl;
};
};
class B : public A
{
public:
B(const string& name): A(name, true)
{
}
};
int main() {
A obj1("str");
B obj2("str");
return 0;
}
通过利用构造函数的可见性,您可以将其他信息传递给基类。否则,我建议使用稍微修改过的CRTP,使您的基类知道对象本身(它们成为一个完全不同的实体)。
答案 1 :(得分:0)
你可以有两个doSomething
重载,但是......
void doSomething(A*);
void doSomething(B*);
在通话网站上,您可以:
doSomething(this);
(this
为A*
或B*
,因此会调用相应的函数。)
class A
{
A(const String& name)
{
doSomething(this);
}
}
class B : A
{
B(const String& name): A(name)
{
doSomething(this);
}
}
但,正如其他人在评论中所说,你有一个设计问题!