我的问题是关于成员函数指针的。这里有一个示例代码:类和
是同一类型的
我的问题是:这个行为是由C++标准定义的吗?这个设计决策的依据是什么?
#include <type_traits>
#include <iostream>
struct A {
void foo() {
std::cout << this << std::endl;
}
int a;
};
struct B {
void bar() {
std::cout << this << std::endl;
}
int b;
};
struct C : public A, B { };
int main() {
auto p1 = &C::foo; // p1 is void (A::*)();
auto p2 = &C::bar; // p2 is void (B::*)();
auto p3 = &A::foo; // p3 is void (A::*)();
bool b1 = std::is_same<decltype(p1), decltype(p2)>::value;
bool b2 = std::is_same<decltype(p1), decltype(p3)>::value;
std::cout << b1 << std::endl; // false
std::cout << b2 << std::endl; // true
return 0;
}
是的,这是标准规定的:
当您有一个从其他类继承的类时,那些类的成员不是派生类的成员。它们仍然是其类的成员,派生类继承它们。所以,
就像当你把一堆书放在你的书架上时,那些书中的章节并没有成为书架的一部分。它们仍然是书中相同的章节,你的书架就是存取它们的手段。
类似地,您可以使用
当使用use
这种选择背后的基本原理是这样一个事实:对一种类型的假设越少,它就越好。
是从a继承的成员函数的最通用类型。
你为什么要强制执行一个更严格的类型?这是一个双赢的局面。