簡體   English   中英

從類外部訪問私有虛擬函數

[英]Accessing a private virtual function from outside the class

我知道,就良好的編程習慣而言,這不是一個好主意,但是我一直在嘗試解決一個相對困難的問題,並希望能獲得一些見識。 本質上,我試圖輸出類的所有成員,如下所示:

class protoCalc
{
    private:
        int x; 
        int y;
        virtual int basicAddition()
        {
            return x + y;
        }
        virtual int basicMultiplication()
        {
           return x*y;
        }
public:
    protoCalc(){
        x = 14;
        y = 120;
    }
};

事實證明,訪問x和y非常容易。 為此,我編寫了一個函數(包括對它如何工作的想法,無論它們是否正確):

int private_member_Print(void* proto)
{
    protoCalc* medium = (protoCalc*)proto;
    protoCalc halfway = *medium;
    int* ptr = ((int *)(&halfway));
return ptr[1];

}

上面將返回x的值,如果使用ptr [2],它將返回y的值。

現在我有兩個問題,第一個是ptr [0]指向什么? 那不是私有成員x占用的那部分內存,因為那是protoCalc類的第一個成員? 如果沒有,那么這個地址將占用什么呢?

其次,如何訪問虛擬功能? 我的第一個直覺是,地址ptr [3]將被basicAddition()虛擬函數占用,而ptr [4]將被basicMultiplication()函數占用,但是事實並非如此。 當這不成立時,我的下一個想法就是ptr [0]包含指向虛擬成員表位置的指針,該表保存着我正在尋找的兩個函數。 但是,這也被證明是錯誤的。

那么,當我訪問私有成員x和y時,如何在類之外訪問這些虛擬函數呢? 顯然,我可以更改情況以使其變得更容易,但是這樣做會破壞問題的目的。

您當前正在執行的操作是未定義的行為。 在大多數情況下,對象在內存中的布局由編譯器決定,您不知道編譯器將每個成員放置在內存中的位置。

話雖如此,有一種方法可以實現這一目標,那就是您嚴重濫用模板。 我強烈建議您不要這樣做,而應提供成員函數來訪問所需的數據。

這是一個實際的例子。

#include <iostream>

class Priv {
private:
    int i;
    void print( ) {
        std::cout << i << std::endl;
    }

public:
    Priv( ) : i( 100 ) {}

    void print_pub( ) {
        std::cout << "Public" << std::endl;
        this->print( );
    }
};

template<typename Tag>
struct result {
  /* export it ... */
  typedef typename Tag::type type;
  static type ptr;
};

template<typename Tag>
typename result<Tag>::type result<Tag>::ptr;

template<typename Tag, typename Tag::type p>
struct rob : result<Tag> {
  /* fill it ... */
  struct filler {
    filler() { result<Tag>::ptr = p; }
  };
  static filler filler_obj;
};

template<typename Tag, typename Tag::type p>
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj;

struct Priv_f { typedef void ( Priv::*type )(); };
template class rob< Priv_f, &Priv::print >;

struct Priv_i { typedef int Priv::*type; };
template class rob< Priv_i, &Priv::i >;

int main( ) {
    Priv p;

    (p.*result<Priv_i>::ptr) = 1;
    (p.*result<Priv_f>::ptr)(); 

}

rob / result模板類的說明可以在此處找到。 它應該可以跨編譯器工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM