精华内容
下载资源
问答
  • 在派生类中实现与基类方法相同的方法,返回值和特征标都一样,在派生类中就相当于覆盖基类的该方法。 #include <iostream> using namespace std; class Fish{ private: bool isFreshWaterFish; ...

    派生类覆盖基类方法

    在派生类中实现与基类方法名相同的方法,返回值和特征标都一样,在派生类中就相当于覆盖基类的该方法。

    #include <iostream>
    using namespace std;
    class Fish{
    private:
    	bool isFreshWaterFish;
    public:
    	Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}
    	void Swim(){
    		if(isFreshWaterFish){cout<<"Swim in lake"<<endl;}
    		else{cout<<"Swim in sea"<<endl;}
    	}
    } 
    class Tuna:public Fish{
    public:
    	Tuna():Fish(false){}
    	void Swim(){
    		cout<<"Tuna swim in sea"<<endl;
    	}
    }
    int main(){
    	Tuna myTuna;
    	myTuna.Swim();
    	return 0;
    }
    输出:
    Tuna swim in sea
    

    那么如何在main()调用基类实现的,但是被派生类覆盖的方法?
    需要使用作用域标识符(::)

    Tuna myTuna;
    myTuna.Fish::Swim();//调用基类中实现的方法
    myTuna.Swim();//调用派生类实现的方法
    

    那么又怎么在派生类中调用基类实现的方法?

    Fish::Swim();
    

    在派生类中隐藏基类的方法

    #include <iostream>
    using namespace std;
    
    class Fish{
    private:
    	bool isFreshWaterFish;
    public:
    	Fish(bool isFreshWater):isFreshWaterFish(isFreshWater){}
    	void Swim(){
    		cout<<"Swim in ..."<<endl;
    	}
    	void Swim(bool isFreshWater){
    		if(isFreshWaterFish){cout<<"Swim in lake"<<endl;}
    		else{cout<<"Swim in sea"<<endl;}
    	}
    } 
    class Tuna:public Fish{
    public:
    	Tuna():Fish(false){}
    	void Swim(){
    		cout<<"Tuna swim in sea"<<endl;
    	}
    }
    int main(){
    	Tuna myTuna;
    	myTuna.Swim();
    	//myTuna.Swim(false);
    	return 0;
    }
    
    

    其中myTuna.Swim(false);将会导致编译错误。由于派生类实现自己的Swim()方法,覆盖基类的Swim()方法以及重载方法。
    解决方案有:

    1. 使用作用域表示符myTuna.Fish::Swim();
    2. 使用关键字using解除对Fish::Swim()的隐藏
    class Tuna {
    	public:
    	using Fish::Swim;
    	void Swim(){
    		cout<<"Tuna swim in sea"<<endl;
    	}
    }
    
    1. 在派生类中实现基类所有重载的版本(Tuna类中覆盖Fish类)

    切除问题

    将一个派生类实例化对象,复制给其基类对象,编译器只复制基类所能承受的部分,这是一种无意间造成的裁剪数据,所以一般不要使用值传递,应该使用基类指针或者const引用的方式传递。

    展开全文
  • 我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态。这么说来,在派生类中重定义(override)虚函数是没有任何问题的。那么...

    我们都知道,在基类中定义虚函数的目的是允许派生类拥有相同接口却可以有不同的实现,通过对象的指针或引用来访问虚函数可以实现运行时的多态。这么说来,在派生类中重定义(override)虚函数是没有任何问题的。那么,可以重定义基类中的非虚函数吗?

    答案是:技术上你可以这样做(至少编译器不会报错),但是绝大多数情况下不应该做

    class Base
    {
    public:
       void f() { cout << "Base::f()" << endl; }
    };
    
    class Derived: public Base
    {
    public:
       void f() { cout << "Derived::f()" << endl; }
    };
    
    int main()
    {
       Derived d;
       Base *pb = &d;
       // Base::f()
       pb->f();
       Derived *pd = &d;
       // Derived::f()
       pd->f();   
    }
    上面的代码有一个诡异的行为:对同一个派生类对象调用同样的函数,返回的结果是不一样的。这是因为普通的非虚函数体在编译期就与函数调用绑定,指针的类型决定了哪个函数被调用。通过Base*调用的f一定是基类的,而通过Derived*调用的f一定是派生类的。

    从面向对象的角度来说,在派生类中重定义基类中的非虚函数可能会违反公有继承Is-A的关系。公有继承是说每一个派生类对象都可以被当做基类对象来处理。基类的每一个接口和不变量派生类也有。而非虚函数的具体实现是类不变量的一部分。如果重定义了非虚函数,类不变量就可能被打破,派生类对象将不再是基类对象(当通过指向派生类对象的指针访问f时)。

    很少情况下,需要重定义非虚函数。一个特例是为了解决私有继承中的名字隐藏问题。在私有继承中,基类的公有函数在派生类中都是私有,如果派生类想要继承基类的某个接口,可以使用所谓的forwarding function。即通过定义一个与基类一模一样的函数,它的实现仅仅是调用基类的对应函数。注意,使用using语句是不可行的,它会把同名的所有重载函数(f()与f(int))都一起导入派生类,参见:C++名字隐藏对公有继承的影响

    class Base
    {
    public:
      f();
      f(int i);
    };
    
    class Derived: private Base
    {
    public:
      // forwarding function
      f() { Base::f(); }
    };

    小结:

    绝大多数情况下不要重新定义基类的非虚函数,那样会打破公有继承Is-A的关系,而且行为诡异。




    展开全文
  • 以下简单示例演示了在基类中声明可从派生类引发的事件的标准方法。此模式广泛应用于 .NET Framework 类库中的 Windows 窗体类。 创建可用作其他类的基类的类时,应考虑如下事实:事件是特殊类型的委托,只可以从...
  • 我们明确初始化一个派生类对象时,会先调用基类的构造函数,然后再调用派生类的构造函数;回收资源的时候,先调用派生类的析构函数,再调用基类的析构函数。 我们初始化一个派生类的对象时,如何去初始化一个...

    我们明确在初始化一个派生类对象时,会先调用基类的构造函数,然后再调用派生类的构造函数;在回收资源的时候,先调用派生类的析构函数,再调用基类的析构函数。

    我们在初始化一个派生类的对象时,如何去初始化一个基类的成员变量呢?这里的初始化是指将基类成员变量初始化成我们指定的参数,也就是说想要在初始化派生类对象时将派生类和基类的成员变量的值都传进去。

    #include<iostream>
    
    using namespace std;
    
    class Date
    {
    public:
    	Date(int year=0 , int month=0 , int day=0)
    		:_year(year)
    		, _month(month)
    		, _day(day)
    	{
    		cout << "基类构造函数调用" << endl;
    	}
    	Date(const Date& date)
    	{
    		_year = date._year;
    		_month = date._month;
    		_day = date._day;
    		cout << "基类拷贝构造函数调用" << endl;
    	}
    	~Date()
    	{
    		cout << "基类析构函数调用" << endl;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    
    class DateSon:public Date
    {
    public:
    	DateSon(int hour = 0, int min = 0, int sec = 0, int year = 0, int month = 0, int day = 0)
    		:_hour(hour)
    		, _min(min)
    		, _sec(sec)
    		,Date(year,month,day)
    	{
    		cout << "派生类构造函数调用" << endl;
    	}
    	DateSon(const DateSon& date)
    		:Date(date)
    	{
    		_hour = date._hour;
    		_min = date._min;
    		_sec = date._sec;
    		cout << "派生类拷贝构造函数调用" << endl;
    	}
    	
    	~DateSon()
    	{
    		cout << "派生类析构函数调用" << endl;
    	}
    private:
    	int _hour;
    	int _min;
    	int _sec;
    };
    
    int main()
    {
    	DateSon date1(1,2,3,4,5,6);
    	DateSon date2(date1);
    	return 0;
    }

    解决方法就是需要在派生类中显式的调用基类的构造函数和拷贝构造函数

    展开全文
  • 我原来的想法,创建一个属性返回基类的事件,但是不行。 解决办法: public event PacketArrivalEventHandler OnPacketArrial { add { _device.OnPacketArrival += value; } remove { _device.OnPac

    吐舌头 写代码的时候遇到了这个问题,论坛里大牛给出了解决方法。


    我原来的想法,创建一个属性返回基类的事件,但是不行。



    解决办法:

    public event PacketArrivalEventHandler OnPacketArrial
    {
      add { _device.OnPacketArrival += value; }
      remove { _device.OnPacketArrival -= value; }
    }


    展开全文
  • 只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类可以调用基类的公用成员函数访问基类的私有...
  • C#在派生类中调用基类成员

    千次阅读 2019-10-04 21:57:35
    C#的派生类中,我们可以使用base关键字调用基类中的公有或者受保护成员。这些成员只能是构造函数、实例方法或者实例属性。 base关键字调用基类成员的语法格式如下: base . identifier或 base[expression-list]...
  • C++ - 派生类强制转换为基类

    千次阅读 2014-04-21 19:37:54
    多态的使用时,派生类的指针或引用可以转换为基类的指针或引用, 即基类的指针可以指向派生类基类部分; Base* b = Derived* d; b和d指向的内容是相等的, b == d, 因为之间有一个隐式转换即 b == (Base*)d; b和d的...
  • 定义一个基类Base,有两个公共成员函数fun1()和fun2(),如果私有派生出Derived,如何通过Derived的对象调用基类的函数fun1()和fun2()? 源代码 #include "stdafx.h" #include<iostream> using namespace ...
  • 区分“派生类对象”和“派生类”对基类成员的访问权限 ... 区分“派生类对象”和“派生类”对基类成员...(1)对于公有继承,只有基类的公有成员可以被“派生类对象”访问,其他(保护和私有)成员不能被访问。 (2)对于私...
  • 想不明白啊,高手帮帮忙吧 Derived1 * hh = static_cast*>(new Base); hh->derivedfunction(); // 这里竟然是可以的 为什么...而且即使derivedfunction里面用到派生类的私有成员也是可以的, 这到底是为什么啊???
  • 实例 class base ...因为dynamic_cast向下转换时,会检查该基类指针是否是指向其派生类对象的,否则返回NULL; 说白了,就是检查待转换的指针或引用是否是指向要转换的类型的。      
  • C++派生类中如何初始化基类对象

    千次阅读 2018-08-26 16:41:42
    关于派生类中如何初始化基类对象,我派生类对于构造函数不都是先构造基类对象,然后构造子类对象,但是如果我们成员初始化列表先初始化派生类的私有成员,函数内去调用基类的构造函数,能编译通过吗?...
  • 派生类虚函数调用基类版本

    千次阅读 2012-12-04 10:27:02
    C++ primer 这本书上有这么两句话“派生类虚函数...当你实现派生类虚函数B : foo时,如果函数体内需要调用基类的虚函数版本时,需要显式使用基类的作用域操作符A::foo(),否则foo()就会在派生类作用域内调用派生类
  • c++派生类对象赋值给基类对象

    千次阅读 2017-04-10 10:36:37
    基类对象和派生类对象之间的赋值关系具体是指:基类的对象可不可以赋值给子类对象或者子类对象可不可以赋值给基类对象。  一般来说,只有派生类的对象可以赋值给基类的对象,反之,则不可以。例如: ...
  • 构造函数与基类的其他成员不同,不能被派生类继承,因此为了初始化基类中的成员变量,需要在派生类中调用基类的构造函数(即显式调用),如果派送类没有调用则默认调用基类的无参构造函数(即隐式调用). 显式调用的方式...
  • 隐藏基类成员函数的情况:如果在派生类中定义了一个与基类同名的函数,不管这个函数的参数列表是不是与基类 中的函数相同,则这个同名的函数就会把基类中的所有这个同名的函数的所有重载版本都隐藏了,这时并不是...
  • C++中,如果希望有一个公共基类只声明一个函数接口,该公共基类不进行定义,而是在派生类才重新定义;重新定义时,不同的派生类重新定义不同的功能,则这种情况下,...(当然,如果需要,也可以在公共基类中进行定...
  • //引用是别名,但这个别名只能包含派生类对象的由基类继承来的隐藏对象 #include using namespace std; class B { public: B() { cout; } void fun() { cout()"; } private: int x; }; cla
  • 在派生类中调用基类方法。

    千次阅读 2009-04-10 09:18:00
    base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法。... 示例: 在派生类中调用基类方法。 // base 关键字// 访问基类成员using System;public class BaseClass{ protected string _cl
  • C++继承,很容易遇到一个问题,那就是将派生类指针赋值给基类指针(向上转型)的情况,下面我们就来举例分析: 举一个多继承的例子: #include <iostream> using namespace std; //基类A class A { ...
  • 区分“派生类对象”和“派生类”对基类成员的访问...(2)对于私有继承和保护继承,基类中所有成员都不能被“派生类对象”访问。  “派生类”对基类中成员的访问权限: (1)对于公有继承,基类中的公有成员和保护成
  • 派生类 不能通过 基类对象 访问 基类的protected成员,如果能,不就成了public了吗? 所以“不仅派生类不能通过基类对象访问其protected成员,其他... 如果不在派生类中派生类对象就不可以访问基类的protected成员。
  • 派生类访问模板化基类(templatized base class)的命名 本文地址:http://blog.csdn.net/caroline_wendy/article/details/23993691 派生类继承模板化基类的成员函数, 默认是无法访问, 模板化基类的命名. 原因是...
  • C++基类成员在派生类中的访问属性

    千次阅读 2016-08-03 12:25:55
    基类成员在派生类中的访问属性 基类中的成员 公有派生类中的访问属性 私有派生类中的访问属性 保护派生类中的访问属性 private 不可访问 不可访问 不可访问 public public private protected ...
  • C++ 派生类指针强制指向基类对象

    千次阅读 2014-03-02 17:19:53
    直接用派生类指针指向基类的对象, 会导致语法错误。 但是可以派生类指针强制转换为基 类指针,然后调用基类的成员。 派生类对象指针=static_cast(&基类对象); #include using namespace std; class A { ...
  • 被继承的类称为 基类或是父类 继承者称为 子类或是派生类 class Home extends Mypc{ } ...正常的情况下,避免方法或是属性...在派生类中,访问基类的方法的访问方法 基类名称 :: 基类方法 例如 Mypc::smoefun()

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 173,289
精华内容 69,315
关键字:

在派生类中可以通过基类名