ein*_*ica -4 c++ virtual static-methods static-members
我刚读过(第k次)
这是关于模拟虚拟静态成员的问题.我的问题是 - 是什么让C++标准委托(或之前的Bjarne Stroustrup)没有将此功能添加到C?他们知道会破坏什么吗?或妨碍任何事情的表现(即使不使用)?
为了更好地说明我对功能定义本身的看法,这里有一些代码:
// This does not compile!
class Base {
// A pure virtual member - perhaps need to indicate that somehow
virtual static const string ToWhom;
void sayHello() {
cout << "Hello, " << ToWhom << "!" << endl;
}
};
class World : public Base {
static virtual const string ToWhom = "the entire world"s; // C++14 literal
};
class Everybody : public Base {
static virtual const string ToWhom = "everybody around"s;
};
Run Code Online (Sandbox Code Playgroud)
注意:我不是在询问你的意见或是否添加这些是一个好主意,我在询问历史和官方考虑因素.
首先,让我们看一下静态虚拟外观的无效示例:
// WARNING: This does not compile !!!
class Base {
static virtual string toWhom() {
return "unknown";
}
static void sayHello() {
cout << "Hello, " << toWhom() << "!" << endl;
}
};
class World : public Base {
static virtual string toWhom() {
return "world";
}
};
class Everybody : public Base {
static virtual string toWhom() {
return "everybody";
}
};
Run Code Online (Sandbox Code Playgroud)
这可以让你这样做:
// WARNING: This does not work !!!
Everybody::sayHello(); // Prints "Hello, everybody!"
World::sayHello(); // Prints "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
但问题是,如果不改变在C++中调用静态函数的方式,这样的调度就不容易实现.
回想一下,非静态成员函数this隐式地获取参数.它是this携带有关虚拟功能的信息的参数.但是,当您调用静态函数时,不会传递任何可识别当前类的内容(即上例中的Hellovs Everybody).没有隐式参数,因此无法访问虚函数.
回到上面的例子,考虑一下Base::sayHello调用时会发生什么toWhom().它需要有一定的背景下做出的其中三个功能应称为决策-即Base::toWhom,World::toWhom或Everybody::toWhom.不仅缺少这些信息,而且在语言中也没有现有机制,我们可以通过类似于将指向虚拟函数的指针添加到类的数据的方式"搭载"此功能.
虽然这种调用机制确实可以改变,但该语言的作者没有看到这样做的令人信服的理由.