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