与书本所说不同,现代c++和其编译器在一段时间的发展后,本书3.6节的任何内容基本都不可以认为是对的了.
下面提到的几点都在实验代码有印证
在现代编译器下,使用
在优化开启时这三种时的效率已经相差无几,2,3几乎完全一样,在多重虚继承时,1可能有一些效率牺牲.但是在笔者的简单测试里也是一样的了.
linux下
gcc 11.2.0+clang 14
c++20(c++2a)
#include
#include
#include
using namespace std; // bad
class Point3d
{
public:
static Point3d origin;
float x, y, z;
};
// pointer to data member in multiple inheritance
class B1
{
public:
int v = 1;
};
class B2
{
public:
int v = 2;
};
class D : public B1, public B2
{
public:
int v = 3;
};
void findMemberByClassMemberPointer( int D::*dataMemberPoiner, D* d )
{
printf( "member value= %d\n", d->*dataMemberPoiner );
//how to use data member pointer
};
int main( int argc, const char** argv )
{
// pointer to data member in single data
float Point3d::*px = &Point3d::x;
float Point3d::*py = &Point3d::y;
float Point3d::*pz = &Point3d::z;
float Point3d::*pnull = nullptr;
printf( "float Point3d::*pnull = %p\n", pnull );
printf( "&Point3d::x = %p\n", px );
printf( "&Point3d::y = %p\n", py );
printf( "&Point3d::z = %p\n", pz );
if ( px == NULL || px == nullptr ) {
printf( "px in compiler's angle is nullptr\n" );
}
{
printf( "px is 0x0 but px in compiler's angle is not nullptr\n" );
}
// pointer to data member in multiple inheritance
auto d = new D;
auto drivenClassMemberPointer = &D::v;
findMemberByClassMemberPointer( drivenClassMemberPointer, d );
auto base2ClassMemberPointer = &B2::v;
findMemberByClassMemberPointer( base2ClassMemberPointer, d );
return 0;
}
float Point3d::*pnull = 0xffffffffffffffff
&Point3d::x = (nil)
&Point3d::y = 0x4
&Point3d:😒 = 0x8
px is 0x0 but px in compiler’s angle is not nullptr
member value= 3
member value= 2