关于派生类到基类的转换

时间:2022-09-08 09:09:01
1、派送类引用(指针)到基类引用(指针)的转换,为什么public继承时能转换,而其他继承却不能
2、派生类对象到基类对象的转换,这个转换是否可行,关键在于基类的复制构造函数是否可访问??
但好像又不行,为什么呢
#include<iostream>
using namespace std;

class base
{
public:
base(){}
protected:
base(const base&b){}
};

class derived:public base
{
public:
derived(){}
void test(){ derived d; base b = d;}//基类的复制构造函数是可访问的,但是为什么不行呢?
};

int main()
{

}

6 个解决方案

#1


基本上这样的转换都是不建议使用的

#2


怎么不行,应该可以的啊。
不过貌似复制构造函数应该用:b(d)的形式调用吧。

#3


不行的那步,因为你的基类的复制构造函数是默认的
class base
{
public:
    base() {
        std::cout << "Base's Default Constructor is Called!" << std::endl;
    }
    base(const base &b) { }
};

class derived : public base
{
public:
    derived() : base() { }
    void test() {
        derived d;
        base a = d;
    }
};

这样尝试,然后你就会发现你其实没调用基类的复制构造。

#4


你这个是调用的默认构造函数,跟踪一下就知道了

#5


把 base b = d; 改成 base &b=d; 就可以了
使用多态需要注意,基类必须是指针或者引用。你的代码使用的是传值,这种方式是不支持多态的。

#6


貌似没人回答第一个问题啊,我试着说下
C++的多态只存在于公共继承体系中,其原因一如下,
第一,当你定义一个继承类并将其地址传给一个基类指针时,你会发现这个地址跟直接取继承类地址是完全一样的,既然地址完全一样,指针本身属性都相同(4个字节的内存空间),那么怎么区分是指向基类还是指向派生类呢?这个是编译器的事,但是为了弄清楚继承体系,有必要了解一下,其实编译器根据指针类型的不同对其内容的解释不同,所以才能区分相同地址的指向不同类型对象的指针。
第二,派生体系结构中包含基类的体系结构,但这种情况仅存在于公共派生类中,因为只有公共派生类的成员标号没有改变,集成体系的基本结构是这样:基类或派生类指针->     基类部分-基类部分(如果有多重继承)-派生类部分(不包括基类)
知道了以上,现在就可以回答公共继承才会有多态的问题,对于飞公共派生由于继承类中的基类部分的标识号(属性)发生了改变,此时即使给予一个基类指针指向首地址,也无法保证得到正确的指针解释,所以结论就是这样


惯例,不对楼下补充 关于派生类到基类的转换

#1


基本上这样的转换都是不建议使用的

#2


怎么不行,应该可以的啊。
不过貌似复制构造函数应该用:b(d)的形式调用吧。

#3


不行的那步,因为你的基类的复制构造函数是默认的
class base
{
public:
    base() {
        std::cout << "Base's Default Constructor is Called!" << std::endl;
    }
    base(const base &b) { }
};

class derived : public base
{
public:
    derived() : base() { }
    void test() {
        derived d;
        base a = d;
    }
};

这样尝试,然后你就会发现你其实没调用基类的复制构造。

#4


你这个是调用的默认构造函数,跟踪一下就知道了

#5


把 base b = d; 改成 base &b=d; 就可以了
使用多态需要注意,基类必须是指针或者引用。你的代码使用的是传值,这种方式是不支持多态的。

#6


貌似没人回答第一个问题啊,我试着说下
C++的多态只存在于公共继承体系中,其原因一如下,
第一,当你定义一个继承类并将其地址传给一个基类指针时,你会发现这个地址跟直接取继承类地址是完全一样的,既然地址完全一样,指针本身属性都相同(4个字节的内存空间),那么怎么区分是指向基类还是指向派生类呢?这个是编译器的事,但是为了弄清楚继承体系,有必要了解一下,其实编译器根据指针类型的不同对其内容的解释不同,所以才能区分相同地址的指向不同类型对象的指针。
第二,派生体系结构中包含基类的体系结构,但这种情况仅存在于公共派生类中,因为只有公共派生类的成员标号没有改变,集成体系的基本结构是这样:基类或派生类指针->     基类部分-基类部分(如果有多重继承)-派生类部分(不包括基类)
知道了以上,现在就可以回答公共继承才会有多态的问题,对于飞公共派生由于继承类中的基类部分的标识号(属性)发生了改变,此时即使给予一个基类指针指向首地址,也无法保证得到正确的指针解释,所以结论就是这样


惯例,不对楼下补充 关于派生类到基类的转换