精华内容
下载资源
问答
  • qt 获取父类指针

    2020-10-29 17:49:30
    QWidget *QWidget::parentWidget() const Returns the parent of this widget, or 0 if it does not have any parent widget.

    QWidget *QWidget::parentWidget() const

    Returns the parent of this widget, or 0 if it does not have any parent widget.

    展开全文
  • c++子类和父类指针的转换

    千次阅读 2018-08-15 16:51:55
    1.父类指针无法直接调用子类的新函数,需要转换为子类指针后才能调用。 c++编译器在编译的时候是做静态类型分析,父类指针是否真的指向一个子类类型,编译器并不会做这个假设。因此用父类的指针去调用子类的函数...

    1.父类指针无法直接调用子类的新函数,需要转换为子类指针后才能调用。

    c++编译器在编译的时候是做静态类型分析,父类指针是否真的指向一个子类类型,编译器并不会做这个假设。因此用父类的指针去调用子类的函数无非被识别,这里有一种安全和不安全的方式实现这种转化。

    case1:不安全的方式

     

     
    1. class Base

    2. {

    3. public:

    4. void vritual Func()

    5. {

    6. cout<<"Base Func\n";

    7. }

    8. }

    9. class Child :public Base

    10. {

    11. public:

    12. void Func()

    13. {

    14. cout<<"Child Func\n";

    15. }

    16. void NewFunc()

    17. {

    18. cout<<"Child Newfunc\n";

    19. }

    20.  
    21. }

    22. //测试用例

     
    1. int main()

    2. {

    3. Base *b=new Child;

    4. b->Func();//输出Child Func

    5. //b->NewFunc();//错误 这个函数不是虚函数,不能多态调用

    6. Child *child=(Child *)b;//方式一不安全

    7. child->NewFunc();//Child NewFunc

    8.  
    9. Child *child=dynamic_cast<Child *>(b);//方式二安全方式

    10. if (child!=NULL)

    11. {

    12. child->NewFunc();//Child NewFunc

    13. }

    14.  
    15. return 0;

    16. }

    备注:

     

    1.方式一强制转换方式不安全 

    不安全是因为转换的时候无法得知是否转换成功。编译器强制把b当成Child类型去使用。比如说b本来是真的指向Base而不是Child类型那么强制转换后调用Child的NewFunc可能会导致程序崩溃。

    2.方式二:动态转换方式

    dynamic_cast是在运行时去做转换而非编译时,所以它可以给出是否转换成功的信息。如果转换不成功则返回NULL。所以可以判断转换结果是否为NULL来决定是否能使用该指针不会导致程序崩溃

    转换情况二:

    父类不存在虚函数:

     

     
    1. #include <iostream>

    2. using namespace std;

    3. typedef void(*Fun)(void);

    4. class Base

    5. {

    6. public:

    7. Base(int i):a(i){b = 3;}

    8. void virtual fun() {cout << "Base's funciton" <<endl;}

    9. void this_fun(Base *b)

    10. {

    11. if (b == this)

    12. cout << "it is Base's this" <<endl;

    13. }

    14. private:

    15. int b;

    16. int a;

    17.  
    18. };

    19.  
    20. class Derived: public Base

    21. {

    22. public:

    23. Derived():Base(2),d(0){}

    24. void fun() { cout << "Derived's function" <<endl;}

    25. void this_fun(Derived *d)

    26. {

    27. if (d == this)

    28. cout << "it is Derived's this" <<endl;

    29. }

    30.  
    31.  
    32. private:

    33. int d;

    34. };

     

     

     
    1. int main()

    2. {

    3. Base b(1);

    4. Derived *d=(Derived*) &b;

    5. (*d).this_fun(d);//输出: it is Derived‘s 证明:d指针仍然为指向子类

    6. cout<<*((int *)d)<<endl;//输出:Base 的成员b的值 3 证明:d指向的仍然为父类对象

    7. cout<<*((int *)d+1)<<endl;// 输出:Base 的成员a 的值 1 证明:d指向的仍然为父类对象

    8. d->fun();//d 为指向子类的指针

    9. system("pause");

    10. return 0;

    11. }

    注意:1. *((int *)d) 是将对象指针强转,访问第一个成员 ((int *)b+1)访问对象的第二个成员变量


     

     

     
    1. int main()

    2. {

    3. Base b(1);

    4. Derived *d=(Derived*) &b;

    5. (*d).this_fun(d);//输出的:it is Derived's this 证明:this指针仍然为指向子类

    6. Fun f1=(Fun)*(int*)*(int *)d; //定义一个函数指针 值为d的虚函数

    7. f1();//输出:Base’s function 证明:f1指向父类虚函数表的第一个函数

    8. cout<<*((int *)d)<<endl;//输出:一个一个地址值 17384060

    9. cout<<*((int *)d+1)<<endl;// 输出:Base 的成员b 的值 3 证明:d所指向的对象仍然为父类对象

    10. cout<<*((int *)d+2) <<endl; //输出:Base的成员a 的值 1 证明:d所指向的对象仍然为父类对象

    11. d->fun();//fun是虚函数,因此寻找虚函数表的第一个

    12. system("pause");

    13. return 0;

    14. }

    分析:

    1.Fun f1=(Fun)*(int*)*(int *)d;  

     从右往左分析 (int *)d 转换为一个int 类型的指针,*(int *)d,获取指针所指的内容,其实存放的是地址, 即虚函数表地址(表第一项地址) 

    (int *)*(int *)d 地址强转一下,*(int *)*(int *)d,访问虚函数表的第一项,其实存放的也是指针,(Fun)强转为函数指针 ;

    2.存在虚函数,此时对象布局发生改变


    展开全文
  • iOS开发中子类指针指向父类指针

    千次阅读 2017-04-07 21:42:35
    在iOS开发中我们知道父类指针可以指向子类对象,这是OC的多态。可以当我们将子类指针指向父类对象会发生什么呢? 代码: LSString * str2 = [NSString stringWithFormat:@"2"];  NSLog(@"%@", str2); ...

    在iOS开发中我们知道父类指针可以指向子类对象,这是OC的多态。可以当我们将子类指针指向父类对象会发生什么呢?

    代码:

    LSString * str2 = [NSString stringWithFormat:@"2"];

     NSLog(@"%@", str2);

    LSString是继承自NSString的一个子类,当写出上面代码的时候会有一个 警告:Incompatible pointer types initializing 'LSString *' with an expression of type 'NSString *'。这是因为str2指针类型和NSString *类型不相同,这是需要我们对后者进行一个强转,代码:

     // 子类指针指向父类需要进行强转

        LSString * str2 = (LSString *)[NSString stringWithFormat:@"2"];

        NSLog(@"%@", str2);

    这样就不会有警告了。




    展开全文
  • 1、父类指针获取子类成员变量 1 #include <iostream> 2 3 using namespace std; 4 5 class Base { 6 public: 7 virtual void get() {} 8 }; 9 10 class Derive :public Base 11 { ...

    1、父类指针获取子类成员变量

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class Base {
     6 public:
     7     virtual void get() {}
     8 };
     9 
    10 class Derive :public Base
    11 {
    12 public:
    13     Derive(){}
    14     void get() {
    15         printf("The third element is %d\n", _x[2]);
    16     };
    17     int _x[6] = { 0,1,2,3,4,5 };
    18 };
    19 
    20 int main()
    21 {
    22     Base *base = new Derive();
    23     base->get();
    24 
    25     return 0;
    26 }

    2、类型转换

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 class Base
     6 {
     7 public:
     8     void virtual Func()
     9     {
    10         cout << "Base\n";
    11     }
    12 };
    13 
    14 class Derived : public Base
    15 {
    16 public:
    17     void Func()
    18     {
    19         cout << "Derived\n";
    20     }
    21 
    22     void NewFunc()
    23     {
    24         cout << "New func\n";
    25     }
    26     int x[5] = { 0,1,2,3,4 };
    27 };
    28 
    29 int main()
    30 {
    31     Base* b = new Derived();
    32     b->Func();
    33     
    34     Derived* d =dynamic_cast<Derived*>(b) ;
    35     // 不安全的转换
    36     //Derived* d = (Derived*)b;
    37     d->NewFunc();
    38     cout << d->x[2] << endl;
    39 
    40     return 0;
    41 }

     

    转载于:https://www.cnblogs.com/xidian2014/p/8507788.html

    展开全文
  • 父类指针指向子类对象的理解

    千次阅读 2017-05-09 23:47:28
    父类子类指针函数调用注意事项:1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit ...
  • // 父类指针可以指向子类 Circle *circle_point1; // p = new Shape; // 不能用子类指针指向父类对象,即不能将父类对象赋值给子类指针,数据不够 shape_point1 = &shape1; // 父类指父类 cout "Shape->...
  • 程序运行截图如下:解决此问题的关键是:父类用一个虚函数返回一个值。每个子类通过对这个值设置不同的数据。从而判断不同的类,或不同的对象;代码如下:#include &lt;iostream&gt; #include &lt;...
  • class C : public A { public: typedef C class_type; ... }; A* c = new C(); c该如何获取class_type 并使用呢 ?
  •  * 用 c 语言实现类的继承,并且可用父类指针操作子类对像的一个测试例子  *  * @Author: tomken.zhang  *   */ #include #include #include // 定义一个动物类,有二个方法 struct v_animal_...
  • 看下面例子: #include "stdafx.h" #include class A { //父类 public:  void f() //普通函数  {  std::cout  }  void virtual vf() //虚函数  {  std::cout  };
  • 看下面例子: #include "stdafx.h" #include <...class A { //父类 public:  void f() //普通函数  {  std::cout<<"A"<<std::endl;  }  void virtual vf() //虚函数  { ...
  • 父类子类指针问题

    2019-03-07 21:45:52
    类相关 ...方法的重写(override)两同两小一大原则:方法重写的返回值类型需要相同,重写就是子类继承了父类的方法,并在此方法上重写属于自己的特征,既然是继承过来的,那么它的返回值类型就必须要...
  • 父类中有如下代码: public String getKeyToValue...但是 获取该对象的值的时候f.get(this) ,就出现了空指针. 此外,当然有其他方法可以实现该功能,我只是想通过反射获取,这样可以不用关心属性个数. 谢谢各位了.
  • 1,直接用基类指针引用基类对象2,直接用派生类指针引用派生类对象3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,但是只能引用基类成员。若试图通过基类指针引用那些只在...
  • void CenterLayer::zhanzheng(CCObject* pSender){   ((GameScene*)this-&gt;getParent())-&...getParent() 会获得一个父类的一个node型指针,然后转换为父类类型,可以使用这个指针...
  • C++ 父类使用的this指针

    千次阅读 2013-07-26 15:25:12
    比如说 ---------------------------------------------------------- ... 父类 ----------------------------------------------------------------  class FatherClass - { | private: | static FatherClass
  • 因为Do是虚函数,它有一个虚函数表(可以理解为一个数组),存放着类内虚函数的地址,而class C继承了class B,当new C时class C的虚函数表覆盖了B的虚函数表,因此即使b属于父类指针,当他调用Do函数时,执行的就成...
  • 我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 关键字 typeid,有关此...
  • MFC中几种获取视图指针方法

    千次阅读 2012-11-27 17:11:55
    当用VC++的Application Wizard生成除了CDialog Basiced以外的应用程序时,将自动产生视图类、文档类、主帧窗口类、应用程序类等等。...从视图类获得文档类的指针是很容易的,用GetDocument即可,这在一般的MFC文档
  • 最近在写一个MFC程序,其中遇到了子窗口调用父窗口指针的问题,具体解决过程如下:一、创建子窗口(这里就不详细说了,可以自己百度,网上有相关的教程)二、子窗口调用父窗口指针的函数代码CMFCDlg *pDlg = ...
  • 比如说FViewport * VictoryViewport这个是指向父类对象的指针,FSceneViewport是子类,但是他是 没有构造函数的,也没有办法实例化,由内部系统调用,具体怎么用不清楚。 那么我有可能在不修改内部系统代码的情况下...
  • 学C++几天了,在一个视频中看到,说父类中出现的this指针,一旦有子类调用那么这个this指针就是指向派生类的,这句话我想了下大概明白,自己写了个例子不知道能不能支持这句话: #include <iostream.h> ...
  • 在这里 this->getParent() 会获得一个父类的一个node型指针,然后转换为父类类型,可以使用这个指针调用父类函数。   [cpp]   view plain   copy   print ? _centerLayer=CenterLayer::create()...
  • 从成员对象指针获取父对象指针

    千次阅读 2015-06-03 09:29:54
    1 问题阐述 ...关于子类实例是否可以获得父类指针的问题 [2] 父类指针指向子类对象的理解 [3] c++的成员类对象如何得到父对象的指针 关于子类实例是否可以获得父类指针的问题
  • void CenterLayer::zhanzheng(CCObject* pSender){   ((GameScene*)this-&gt;getParent())-&...getParent() 会获得一个父类的一个node型指针,然后转换为父类类型,可以使用这个指...
  • QT 子窗口获取父窗口指针的方法

    万次阅读 2016-07-08 15:31:42
    QT 子窗口获取父窗口指针的方法如下: qobject_cast(parentWidget())->ui.actionPlayStop->setDisabled(true);
  • 解决Servlet在doGet/doPost中获取ServletContext对象出现空指针 原因:重写了init(ServletConfig config)方法,但没有调用super.init(config),在父类init(ServletConfig config中有获取ServletContext对象的引用,...
  • 指针

    2013-06-19 22:21:38
    关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类指针调用实际子类的成员函数。这种技术可以让父类指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,159
精华内容 26,063
关键字:

获取父类的指针