阿里一面——struct和class的区别|基类指针与派生类指针的强转
1.struct和class的区别
1.1. 成员
- struct的默认访问权限为public, 而class的默认访问权限为private
- 成员的权限设置:可以使用访问修饰符来控制成员的访问级别,例如private
struct ExampleStruct {
private:
int privateValue;
public:
ExampleStruct(int val) : privateValue(val) {}
void printValue() const {
std::cout << privateValue << std::endl;
}
};
1.2. 函数
- struct和class语义上几乎是相同的,都可以包含构造函数、析构函数、操作符、成员函数等
- 不能继承
2. 基类指针与派生类指针的强转
- 即便基类指针指向的是一个派生类的对象,也不能通过基类指针访问基类没有而派生类中有的成员。
- 基类的指针不能直接赋值给派生类的指针, 需要通过强制类型转换。但是注意,需要保证被转换的基类指针本来就指向一个派生类的对象,这样才是安全的。
这里参考一篇博文中的例子: C++基类和派生类指针的相互赋值和转换
CDerived objDerived(3); //派生类
CBase objBase(5); //基类
CBase * pBase = &objDerived; // 将基类指针指向派生类对象
//CDerived * pDerived = & objBase; //错,不能将基类指针赋值给派生类指针
CDerived * pDerived = (CDerived *)(&objBase);
...
另一篇博文《基类和派生类互转》中,提供了类指针之间显示转换的安全做法——使用dynamic_cast或static_cast。
1、有继承关系
(1)子类转成父类: dynamic_cast和static_cast都可.
(2)父类转成子类:
没有虚函数:static_cast
有虚函数:
static_cast能转换成功。
父类指针的确指向的是子类实例,dynamic_cast转换成功,否则返回NULL;
(3)读写成员和函数:
如果转换成功(返回的指针不为NULL), 二者都可以用来读写父类和子类成员函数和变量。
如果父类指针不是指向子类实例, static_cast虽然能够通过编译和返回非空指针,但是不能操作子类的成员变量。
2、没有继承关系
(1)只能使用static_cast。但是不能读写成员变量和函数。